nouveau: call notifier/grobj etc funcs directly

libdrm_nouveau is linked with the winsys, there's no good reason to do all
this through yet another layer.
This commit is contained in:
Ben Skeggs 2009-06-05 08:47:42 +10:00
parent d4d584b16e
commit 1b207d9bb8
15 changed files with 195 additions and 226 deletions

View File

@ -4,6 +4,7 @@
struct nouveau_screen {
struct pipe_screen base;
struct nouveau_device *device;
struct nouveau_channel *channel;
};
static inline struct nouveau_screen *

View File

@ -27,33 +27,6 @@ struct nouveau_winsys {
struct pipe_winsys *ws;
struct nouveau_channel *channel;
int (*res_init)(struct nouveau_resource **heap, unsigned start,
unsigned size);
int (*res_alloc)(struct nouveau_resource *heap, int size, void *priv,
struct nouveau_resource **);
void (*res_free)(struct nouveau_resource **);
int (*grobj_alloc)(struct nouveau_winsys *, int grclass,
struct nouveau_grobj **);
void (*grobj_free)(struct nouveau_grobj **);
int (*notifier_alloc)(struct nouveau_winsys *, int count,
struct nouveau_notifier **);
void (*notifier_free)(struct nouveau_notifier **);
void (*notifier_reset)(struct nouveau_notifier *, int id);
uint32_t (*notifier_status)(struct nouveau_notifier *, int id);
uint32_t (*notifier_retval)(struct nouveau_notifier *, int id);
int (*notifier_wait)(struct nouveau_notifier *, int id,
int status, double timeout);
int (*surface_copy)(struct nouveau_winsys *, struct pipe_surface *,
unsigned, unsigned, struct pipe_surface *,
unsigned, unsigned, unsigned, unsigned);
int (*surface_fill)(struct nouveau_winsys *, struct pipe_surface *,
unsigned, unsigned, unsigned, unsigned, unsigned);
struct nouveau_bo *(*get_bo)(struct pipe_buffer *);
};
extern struct pipe_screen *

View File

@ -105,10 +105,9 @@ static void
nv04_screen_destroy(struct pipe_screen *pscreen)
{
struct nv04_screen *screen = nv04_screen(pscreen);
struct nouveau_winsys *nvws = screen->nvws;
nvws->notifier_free(&screen->sync);
nvws->grobj_free(&screen->fahrenheit);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->fahrenheit);
nv04_surface_2d_takedown(&screen->eng2d);
FREE(pscreen);
@ -127,6 +126,7 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv04_screen *screen = CALLOC_STRUCT(nv04_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
unsigned fahrenheit_class = 0, sub3d_class = 0;
int ret;
@ -135,6 +135,13 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
pscreen = &screen->base.base;
ret = nouveau_screen_init(&screen->base, dev);
if (ret) {
nv04_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
screen->nvws = nvws;
pscreen->winsys = ws;
@ -145,7 +152,6 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv04_screen_init_miptree_functions(pscreen);
nv04_screen_init_transfer_functions(pscreen);
nouveau_screen_init(&screen->base, dev);
if (dev->chipset >= 0x20) {
fahrenheit_class = 0;
@ -163,26 +169,30 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv04_surface_buffer;
/* 3D object */
ret = nvws->grobj_alloc(nvws, fahrenheit_class, &screen->fahrenheit);
ret = nouveau_grobj_alloc(chan, 0xbeef0001, fahrenheit_class,
&screen->fahrenheit);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return NULL;
}
BIND_RING(chan, screen->fahrenheit, 7);
/* 3D surface object */
ret = nvws->grobj_alloc(nvws, sub3d_class, &screen->context_surfaces_3d);
ret = nouveau_grobj_alloc(chan, 0xbeef0002, sub3d_class,
&screen->context_surfaces_3d);
if (ret) {
NOUVEAU_ERR("Error creating 3D surface object: %d\n", ret);
return NULL;
}
BIND_RING(chan, screen->context_surfaces_3d, 6);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv04_surface_buffer;
/* Notifier for sync purposes */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv04_screen_destroy(pscreen);

View File

@ -4,6 +4,7 @@
#include "nouveau/nouveau_winsys.h"
#include "nouveau/nouveau_util.h"
#include "nouveau/nouveau_screen.h"
#include "nv04_surface_2d.h"
static INLINE int

View File

@ -102,10 +102,9 @@ static void
nv10_screen_destroy(struct pipe_screen *pscreen)
{
struct nv10_screen *screen = nv10_screen(pscreen);
struct nouveau_winsys *nvws = screen->nvws;
nvws->notifier_free(&screen->sync);
nvws->grobj_free(&screen->celsius);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->celsius);
FREE(pscreen);
}
@ -123,6 +122,7 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv10_screen *screen = CALLOC_STRUCT(nv10_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
unsigned celsius_class;
int ret;
@ -131,6 +131,13 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
pscreen = &screen->base.base;
ret = nouveau_screen_init(&screen->base, dev);
if (ret) {
nv10_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
screen->nvws = nvws;
pscreen->winsys = ws;
@ -141,11 +148,6 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv10_screen_init_miptree_functions(pscreen);
nv10_screen_init_transfer_functions(pscreen);
nouveau_screen_init(&screen->base, dev);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv10_surface_buffer;
/* 3D object */
if (dev->chipset >= 0x20)
@ -162,14 +164,20 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
ret = nvws->grobj_alloc(nvws, celsius_class, &screen->celsius);
ret = nouveau_grobj_alloc(chan, 0xbeef0001, celsius_class,
&screen->celsius);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return FALSE;
}
BIND_RING(chan, screen->celsius, 7);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv10_surface_buffer;
/* Notifier for sync purposes */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv10_screen_destroy(pscreen);

View File

@ -1,5 +1,4 @@
#include "pipe/p_screen.h"
#include "util/u_simple_screen.h"
#include "nv20_context.h"
#include "nv20_screen.h"
@ -103,10 +102,9 @@ static void
nv20_screen_destroy(struct pipe_screen *pscreen)
{
struct nv20_screen *screen = nv20_screen(pscreen);
struct nouveau_winsys *nvws = screen->nvws;
nvws->notifier_free(&screen->sync);
nvws->grobj_free(&screen->kelvin);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->kelvin);
FREE(pscreen);
}
@ -124,6 +122,7 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv20_screen *screen = CALLOC_STRUCT(nv20_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
unsigned kelvin_class = 0;
int ret;
@ -132,6 +131,13 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
pscreen = &screen->base.base;
ret = nouveau_screen_init(&screen->base, dev);
if (ret) {
nv20_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
screen->nvws = nvws;
pscreen->winsys = ws;
@ -142,11 +148,6 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv20_screen_init_miptree_functions(pscreen);
nv20_screen_init_transfer_functions(pscreen);
nouveau_screen_init(&screen->base, dev);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv20_surface_buffer;
/* 3D object */
if (dev->chipset >= 0x25)
@ -159,14 +160,20 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
ret = nvws->grobj_alloc(nvws, kelvin_class, &screen->kelvin);
ret = nouveau_grobj_alloc(chan, 0xbeef0097, kelvin_class,
&screen->kelvin);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return FALSE;
}
BIND_RING(chan, screen->kelvin, 7);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv20_surface_buffer;
/* Notifier for sync purposes */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv20_screen_destroy(pscreen);

View File

@ -29,11 +29,10 @@ nv30_query_create(struct pipe_context *pipe, unsigned query_type)
static void
nv30_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
{
struct nv30_context *nv30 = nv30_context(pipe);
struct nv30_query *q = nv30_query(pq);
if (q->object)
nv30->nvws->res_free(&q->object);
nouveau_resource_free(&q->object);
FREE(q);
}
@ -54,9 +53,9 @@ nv30_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
pipe->get_query_result(pipe, pq, 1, &tmp);
}
if (nv30->nvws->res_alloc(nv30->screen->query_heap, 1, NULL, &q->object))
if (nouveau_resource_alloc(nv30->screen->query_heap, 1, NULL, &q->object))
assert(0);
nv30->nvws->notifier_reset(nv30->screen->query, q->object->start);
nouveau_notifier_reset(nv30->screen->query, q->object->start);
BEGIN_RING(rankine, NV34TCL_QUERY_RESET, 1);
OUT_RING (1);
@ -84,27 +83,27 @@ nv30_query_result(struct pipe_context *pipe, struct pipe_query *pq,
{
struct nv30_context *nv30 = nv30_context(pipe);
struct nv30_query *q = nv30_query(pq);
struct nouveau_winsys *nvws = nv30->nvws;
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
if (!q->ready) {
unsigned status;
status = nvws->notifier_status(nv30->screen->query,
q->object->start);
status = nouveau_notifier_status(nv30->screen->query,
q->object->start);
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
if (wait == FALSE)
return FALSE;
nvws->notifier_wait(nv30->screen->query, q->object->start,
NV_NOTIFY_STATE_STATUS_COMPLETED,
0);
nouveau_notifier_wait_status(nv30->screen->query,
q->object->start,
NV_NOTIFY_STATE_STATUS_COMPLETED, 0);
}
q->result = nvws->notifier_retval(nv30->screen->query,
q->object->start);
q->result = nouveau_notifier_return_val(nv30->screen->query,
q->object->start);
q->ready = TRUE;
nvws->res_free(&q->object);
nouveau_resource_free(&q->object);
}
*result = q->result;

View File

@ -124,14 +124,13 @@ static void
nv30_screen_destroy(struct pipe_screen *pscreen)
{
struct nv30_screen *screen = nv30_screen(pscreen);
struct nouveau_winsys *nvws = screen->nvws;
nvws->res_free(&screen->vp_exec_heap);
nvws->res_free(&screen->vp_data_heap);
nvws->res_free(&screen->query_heap);
nvws->notifier_free(&screen->query);
nvws->notifier_free(&screen->sync);
nvws->grobj_free(&screen->rankine);
nouveau_resource_free(&screen->vp_exec_heap);
nouveau_resource_free(&screen->vp_data_heap);
nouveau_resource_free(&screen->query_heap);
nouveau_notifier_free(&screen->query);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->rankine);
FREE(pscreen);
}
@ -141,6 +140,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv30_screen *screen = CALLOC_STRUCT(nv30_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
struct nouveau_stateobj *so;
unsigned rankine_class = 0;
@ -150,6 +150,13 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
pscreen = &screen->base.base;
ret = nouveau_screen_init(&screen->base, dev);
if (ret) {
nv30_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
screen->nvws = nvws;
pscreen->winsys = ws;
@ -160,11 +167,6 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv30_screen_init_miptree_functions(pscreen);
nv30_screen_init_transfer_functions(pscreen);
nouveau_screen_init(&screen->base, dev);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv30_surface_buffer;
/* 3D object */
switch (dev->chipset & 0xf0) {
@ -187,14 +189,20 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
ret = nvws->grobj_alloc(nvws, rankine_class, &screen->rankine);
ret = nouveau_grobj_alloc(chan, 0xbeef3097, rankine_class,
&screen->rankine);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return FALSE;
}
BIND_RING(chan, screen->rankine, 7);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv30_surface_buffer;
/* Notifier for sync purposes */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv30_screen_destroy(pscreen);
@ -202,14 +210,14 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
/* Query objects */
ret = nvws->notifier_alloc(nvws, 32, &screen->query);
ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
if (ret) {
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
nv30_screen_destroy(pscreen);
return NULL;
}
ret = nvws->res_init(&screen->query_heap, 0, 32);
ret = nouveau_resource_init(&screen->query_heap, 0, 32);
if (ret) {
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
nv30_screen_destroy(pscreen);
@ -217,8 +225,8 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
/* Vtxprog resources */
if (nvws->res_init(&screen->vp_exec_heap, 0, 256) ||
nvws->res_init(&screen->vp_data_heap, 0, 256)) {
if (nouveau_resource_init(&screen->vp_exec_heap, 0, 256) ||
nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
nv30_screen_destroy(pscreen);
return NULL;
}
@ -228,23 +236,23 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_method(so, screen->rankine, NV34TCL_DMA_NOTIFY, 1);
so_data (so, screen->sync->handle);
so_method(so, screen->rankine, NV34TCL_DMA_TEXTURE0, 2);
so_data (so, nvws->channel->vram->handle);
so_data (so, nvws->channel->gart->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->gart->handle);
so_method(so, screen->rankine, NV34TCL_DMA_COLOR1, 1);
so_data (so, nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_COLOR0, 2);
so_data (so, nvws->channel->vram->handle);
so_data (so, nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_VTXBUF0, 2);
so_data (so, nvws->channel->vram->handle);
so_data (so, nvws->channel->gart->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->gart->handle);
/* so_method(so, screen->rankine, NV34TCL_DMA_FENCE, 2);
so_data (so, 0);
so_data (so, screen->query->handle);*/
so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY7, 1);
so_data (so, nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY8, 1);
so_data (so, nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
for (i=1; i<8; i++) {
so_method(so, screen->rankine, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1);
@ -301,7 +309,7 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_emit(nvws, so);
so_ref(NULL, &so);
nouveau_pushbuf_flush(nvws->channel, 0);
nouveau_pushbuf_flush(chan, 0);
return pscreen;
}

View File

@ -645,7 +645,6 @@ out_err:
static boolean
nv30_vertprog_validate(struct nv30_context *nv30)
{
struct nouveau_winsys *nvws = nv30->nvws;
struct pipe_winsys *ws = nv30->pipe.winsys;
struct nouveau_grobj *rankine = nv30->screen->rankine;
struct nv30_vertex_program *vp;
@ -669,15 +668,15 @@ nv30_vertprog_validate(struct nv30_context *nv30)
struct nouveau_stateobj *so;
uint vplen = vp->nr_insns;
if (nvws->res_alloc(heap, vplen, vp, &vp->exec)) {
if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec)) {
while (heap->next && heap->size < vplen) {
struct nv30_vertex_program *evict;
evict = heap->next->priv;
nvws->res_free(&evict->exec);
nouveau_resource_free(&evict->exec);
}
if (nvws->res_alloc(heap, vplen, vp, &vp->exec))
if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec))
assert(0);
}
@ -694,15 +693,16 @@ nv30_vertprog_validate(struct nv30_context *nv30)
if (vp->nr_consts && !vp->data) {
struct nouveau_resource *heap = nv30->screen->vp_data_heap;
if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data)) {
if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data)) {
while (heap->next && heap->size < vp->nr_consts) {
struct nv30_vertex_program *evict;
evict = heap->next->priv;
nvws->res_free(&evict->data);
nouveau_resource_free(&evict->data);
}
if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data))
if (nouveau_resource_alloc(heap, vp->nr_consts, vp,
&vp->data))
assert(0);
}
@ -804,8 +804,6 @@ nv30_vertprog_validate(struct nv30_context *nv30)
void
nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
{
struct nouveau_winsys *nvws = nv30->screen->nvws;
vp->translated = FALSE;
if (vp->nr_insns) {
@ -820,9 +818,9 @@ nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
vp->nr_consts = 0;
}
nvws->res_free(&vp->exec);
nouveau_resource_free(&vp->exec);
vp->exec_start = 0;
nvws->res_free(&vp->data);
nouveau_resource_free(&vp->data);
vp->data_start = 0;
vp->data_start_min = 0;

View File

@ -29,11 +29,10 @@ nv40_query_create(struct pipe_context *pipe, unsigned query_type)
static void
nv40_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
{
struct nv40_context *nv40 = nv40_context(pipe);
struct nv40_query *q = nv40_query(pq);
if (q->object)
nv40->nvws->res_free(&q->object);
nouveau_resource_free(&q->object);
FREE(q);
}
@ -54,9 +53,9 @@ nv40_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
pipe->get_query_result(pipe, pq, 1, &tmp);
}
if (nv40->nvws->res_alloc(nv40->screen->query_heap, 1, NULL, &q->object))
if (nouveau_resource_alloc(nv40->screen->query_heap, 1, NULL, &q->object))
assert(0);
nv40->nvws->notifier_reset(nv40->screen->query, q->object->start);
nouveau_notifier_reset(nv40->screen->query, q->object->start);
BEGIN_RING(curie, NV40TCL_QUERY_RESET, 1);
OUT_RING (1);
@ -84,27 +83,27 @@ nv40_query_result(struct pipe_context *pipe, struct pipe_query *pq,
{
struct nv40_context *nv40 = nv40_context(pipe);
struct nv40_query *q = nv40_query(pq);
struct nouveau_winsys *nvws = nv40->nvws;
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
if (!q->ready) {
unsigned status;
status = nvws->notifier_status(nv40->screen->query,
q->object->start);
status = nouveau_notifier_status(nv40->screen->query,
q->object->start);
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
if (wait == FALSE)
return FALSE;
nvws->notifier_wait(nv40->screen->query, q->object->start,
NV_NOTIFY_STATE_STATUS_COMPLETED,
0);
nouveau_notifier_wait_status(nv40->screen->query,
q->object->start,
NV_NOTIFY_STATE_STATUS_COMPLETED,
0);
}
q->result = nvws->notifier_retval(nv40->screen->query,
q->object->start);
q->result = nouveau_notifier_return_val(nv40->screen->query,
q->object->start);
q->ready = TRUE;
nvws->res_free(&q->object);
nouveau_resource_free(&q->object);
}
*result = q->result;

View File

@ -130,14 +130,13 @@ static void
nv40_screen_destroy(struct pipe_screen *pscreen)
{
struct nv40_screen *screen = nv40_screen(pscreen);
struct nouveau_winsys *nvws = screen->nvws;
nvws->res_free(&screen->vp_exec_heap);
nvws->res_free(&screen->vp_data_heap);
nvws->res_free(&screen->query_heap);
nvws->notifier_free(&screen->query);
nvws->notifier_free(&screen->sync);
nvws->grobj_free(&screen->curie);
nouveau_resource_free(&screen->vp_exec_heap);
nouveau_resource_free(&screen->vp_data_heap);
nouveau_resource_free(&screen->query_heap);
nouveau_notifier_free(&screen->query);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->curie);
nouveau_screen_fini(&screen->base);
@ -149,6 +148,7 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv40_screen *screen = CALLOC_STRUCT(nv40_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
struct nouveau_stateobj *so;
unsigned curie_class = 0;
@ -158,6 +158,13 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
pscreen = &screen->base.base;
ret = nouveau_screen_init(&screen->base, dev);
if (ret) {
nv40_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
screen->nvws = nvws;
pscreen->winsys = ws;
@ -168,11 +175,6 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv40_screen_init_miptree_functions(pscreen);
nv40_screen_init_transfer_functions(pscreen);
nouveau_screen_init(&screen->base, dev);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv40_surface_buffer;
/* 3D object */
switch (dev->chipset & 0xf0) {
@ -194,14 +196,19 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
ret = nvws->grobj_alloc(nvws, curie_class, &screen->curie);
ret = nouveau_grobj_alloc(chan, 0xbeef3097, curie_class, &screen->curie);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
return FALSE;
}
BIND_RING(chan, screen->curie, 7);
/* 2D engine setup */
screen->eng2d = nv04_surface_2d_init(nvws);
screen->eng2d->buf = nv40_surface_buffer;
/* Notifier for sync purposes */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv40_screen_destroy(pscreen);
@ -209,14 +216,14 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
/* Query objects */
ret = nvws->notifier_alloc(nvws, 32, &screen->query);
ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
if (ret) {
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
nv40_screen_destroy(pscreen);
return NULL;
}
ret = nvws->res_init(&screen->query_heap, 0, 32);
nouveau_resource_init(&screen->query_heap, 0, 32);
if (ret) {
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
nv40_screen_destroy(pscreen);
@ -224,8 +231,8 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
/* Vtxprog resources */
if (nvws->res_init(&screen->vp_exec_heap, 0, 512) ||
nvws->res_init(&screen->vp_data_heap, 0, 256)) {
if (nouveau_resource_init(&screen->vp_exec_heap, 0, 512) ||
nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
nv40_screen_destroy(pscreen);
return NULL;
}

View File

@ -855,7 +855,6 @@ out_err:
static boolean
nv40_vertprog_validate(struct nv40_context *nv40)
{
struct nouveau_winsys *nvws = nv40->nvws;
struct pipe_winsys *ws = nv40->pipe.winsys;
struct nouveau_grobj *curie = nv40->screen->curie;
struct nv40_vertex_program *vp;
@ -895,15 +894,15 @@ check_gpu_resources:
struct nouveau_stateobj *so;
uint vplen = vp->nr_insns;
if (nvws->res_alloc(heap, vplen, vp, &vp->exec)) {
if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec)) {
while (heap->next && heap->size < vplen) {
struct nv40_vertex_program *evict;
evict = heap->next->priv;
nvws->res_free(&evict->exec);
nouveau_resource_free(&evict->exec);
}
if (nvws->res_alloc(heap, vplen, vp, &vp->exec))
if (nouveau_resource_alloc(heap, vplen, vp, &vp->exec))
assert(0);
}
@ -925,15 +924,15 @@ check_gpu_resources:
if (vp->nr_consts && !vp->data) {
struct nouveau_resource *heap = nv40->screen->vp_data_heap;
if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data)) {
if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data)) {
while (heap->next && heap->size < vp->nr_consts) {
struct nv40_vertex_program *evict;
evict = heap->next->priv;
nvws->res_free(&evict->data);
nouveau_resource_free(&evict->data);
}
if (nvws->res_alloc(heap, vp->nr_consts, vp, &vp->data))
if (nouveau_resource_alloc(heap, vp->nr_consts, vp, &vp->data))
assert(0);
}
@ -1035,8 +1034,6 @@ check_gpu_resources:
void
nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
{
struct nouveau_winsys *nvws = nv40->screen->nvws;
vp->translated = FALSE;
if (vp->nr_insns) {
@ -1051,9 +1048,9 @@ nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
vp->nr_consts = 0;
}
nvws->res_free(&vp->exec);
nouveau_resource_free(&vp->exec);
vp->exec_start = 0;
nvws->res_free(&vp->data);
nouveau_resource_free(&vp->data);
vp->data_start = 0;
vp->data_start_min = 0;

View File

@ -2241,13 +2241,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
if (!p->data[0] && p->immd_nr) {
struct nouveau_resource *heap = nv50->screen->immd_heap[0];
if (nvws->res_alloc(heap, p->immd_nr, p, &p->data[0])) {
if (nouveau_resource_alloc(heap, p->immd_nr, p, &p->data[0])) {
while (heap->next && heap->size < p->immd_nr) {
struct nv50_program *evict = heap->next->priv;
nvws->res_free(&evict->data[0]);
nouveau_resource_free(&evict->data[0]);
}
if (nvws->res_alloc(heap, p->immd_nr, p, &p->data[0]))
if (nouveau_resource_alloc(heap, p->immd_nr, p,
&p->data[0]))
assert(0);
}
@ -2260,13 +2261,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
struct nouveau_resource *heap =
nv50->screen->parm_heap[p->type];
if (nvws->res_alloc(heap, p->param_nr, p, &p->data[1])) {
if (nouveau_resource_alloc(heap, p->param_nr, p, &p->data[1])) {
while (heap->next && heap->size < p->param_nr) {
struct nv50_program *evict = heap->next->priv;
nvws->res_free(&evict->data[1]);
nouveau_resource_free(&evict->data[1]);
}
if (nvws->res_alloc(heap, p->param_nr, p, &p->data[1]))
if (nouveau_resource_alloc(heap, p->param_nr, p,
&p->data[1]))
assert(0);
}
}
@ -2472,8 +2474,8 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p)
nouveau_bo_ref(NULL, &p->bo);
nv50->screen->nvws->res_free(&p->data[0]);
nv50->screen->nvws->res_free(&p->data[1]);
nouveau_resource_free(&p->data[0]);
nouveau_resource_free(&p->data[1]);
p->translated = 0;
}

View File

@ -136,6 +136,10 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
{
struct nv50_screen *screen = nv50_screen(pscreen);
nouveau_notifier_free(&screen->sync);
nouveau_grobj_free(&screen->tesla);
nouveau_grobj_free(&screen->eng2d);
nouveau_grobj_free(&screen->m2mf);
nouveau_screen_fini(&screen->base);
FREE(screen);
}
@ -145,6 +149,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
{
struct nv50_screen *screen = CALLOC_STRUCT(nv50_screen);
struct nouveau_device *dev = nvws->channel->device;
struct nouveau_channel *chan;
struct pipe_screen *pscreen;
struct nouveau_stateobj *so;
unsigned chipset = dev->chipset;
@ -160,6 +165,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv50_screen_destroy(pscreen);
return NULL;
}
screen->base.channel = chan = nvws->channel;
/* Setup the pipe */
screen->nvws = nvws;
@ -174,20 +180,22 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
nv50_transfer_init_screen_functions(pscreen);
/* DMA engine object */
ret = nvws->grobj_alloc(nvws, 0x5039, &screen->m2mf);
ret = nouveau_grobj_alloc(chan, 0xbeef5039, 0x5039, &screen->m2mf);
if (ret) {
NOUVEAU_ERR("Error creating M2MF object: %d\n", ret);
nv50_screen_destroy(pscreen);
return NULL;
}
BIND_RING(chan, screen->m2mf, 1);
/* 2D object */
ret = nvws->grobj_alloc(nvws, NV50_2D, &screen->eng2d);
ret = nouveau_grobj_alloc(chan, 0xbeef502d, 0x502d, &screen->eng2d);
if (ret) {
NOUVEAU_ERR("Error creating 2D object: %d\n", ret);
nv50_screen_destroy(pscreen);
return NULL;
}
BIND_RING(chan, screen->eng2d, 2);
/* 3D object */
switch (chipset & 0xf0) {
@ -213,15 +221,16 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
return NULL;
}
ret = nvws->grobj_alloc(nvws, tesla_class, &screen->tesla);
ret = nouveau_grobj_alloc(chan, 0xbeef5097, tesla_class, &screen->tesla);
if (ret) {
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
nv50_screen_destroy(pscreen);
return NULL;
}
BIND_RING(chan, screen->tesla, 3);
/* Sync notifier */
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
if (ret) {
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
nv50_screen_destroy(pscreen);
@ -232,8 +241,8 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so = so_new(32, 0);
so_method(so, screen->m2mf, 0x0180, 3);
so_data (so, screen->sync->handle);
so_data (so, screen->nvws->channel->vram->handle);
so_data (so, screen->nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->vram->handle);
so_emit(nvws, so);
so_ref (NULL, &so);
@ -241,9 +250,9 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so = so_new(64, 0);
so_method(so, screen->eng2d, NV50_2D_DMA_NOTIFY, 4);
so_data (so, screen->sync->handle);
so_data (so, screen->nvws->channel->vram->handle);
so_data (so, screen->nvws->channel->vram->handle);
so_data (so, screen->nvws->channel->vram->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->vram->handle);
so_data (so, chan->vram->handle);
so_method(so, screen->eng2d, NV50_2D_OPERATION, 1);
so_data (so, NV50_2D_OPERATION_SRCCOPY);
so_method(so, screen->eng2d, 0x0290, 1);
@ -263,11 +272,11 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_method(so, screen->tesla, NV50TCL_DMA_UNK0(0),
NV50TCL_DMA_UNK0__SIZE);
for (i = 0; i < NV50TCL_DMA_UNK0__SIZE; i++)
so_data(so, nvws->channel->vram->handle);
so_data(so, chan->vram->handle);
so_method(so, screen->tesla, NV50TCL_DMA_UNK1(0),
NV50TCL_DMA_UNK1__SIZE);
for (i = 0; i < NV50TCL_DMA_UNK1__SIZE; i++)
so_data(so, nvws->channel->vram->handle);
so_data(so, chan->vram->handle);
so_method(so, screen->tesla, 0x121c, 1);
so_data (so, 1);
@ -295,9 +304,9 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
}
}
if (nvws->res_init(&screen->immd_heap[0], 0, 128) ||
nvws->res_init(&screen->parm_heap[0], 0, 128) ||
nvws->res_init(&screen->parm_heap[1], 0, 128))
if (nouveau_resource_init(&screen->immd_heap[0], 0, 128) ||
nouveau_resource_init(&screen->parm_heap[0], 0, 128) ||
nouveau_resource_init(&screen->parm_heap[1], 0, 128))
{
NOUVEAU_ERR("Error initialising constant buffers.\n");
nv50_screen_destroy(pscreen);
@ -405,7 +414,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
so_emit(nvws, so);
so_ref (so, &screen->static_init);
so_ref (NULL, &so);
nouveau_pushbuf_flush(nvws->channel, 0);
nouveau_pushbuf_flush(chan, 0);
return pscreen;
}

View File

@ -2,40 +2,6 @@
#include "nouveau_winsys_pipe.h"
static int
nouveau_pipe_notifier_alloc(struct nouveau_winsys *nvws, int count,
struct nouveau_notifier **notify)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws);
return nouveau_notifier_alloc(nvpws->channel, nvpws->next_handle++,
count, notify);
}
static int
nouveau_pipe_grobj_alloc(struct nouveau_winsys *nvws, int grclass,
struct nouveau_grobj **grobj)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(nvws->ws);
struct nouveau_channel *chan = nvpws->channel;
int ret;
ret = nouveau_grobj_alloc(chan, nvpws->next_handle++, grclass, grobj);
if (ret)
return ret;
BEGIN_RING(chan, *grobj, 0x0000, 1);
OUT_RING (chan, (*grobj)->handle);
(*grobj)->bound = NOUVEAU_GROBJ_BOUND_EXPLICIT;
return 0;
}
static struct nouveau_bo *
nouveau_pipe_get_bo(struct pipe_buffer *pb)
{
return nouveau_pipe_buffer(pb)->bo;
}
struct nouveau_winsys *
nouveau_winsys_new(struct pipe_winsys *ws)
{
@ -49,22 +15,6 @@ nouveau_winsys_new(struct pipe_winsys *ws)
nvws->ws = ws;
nvws->channel = nvpws->channel;
nvws->res_init = nouveau_resource_init;
nvws->res_alloc = nouveau_resource_alloc;
nvws->res_free = nouveau_resource_free;
nvws->grobj_alloc = nouveau_pipe_grobj_alloc;
nvws->grobj_free = nouveau_grobj_free;
nvws->notifier_alloc = nouveau_pipe_notifier_alloc;
nvws->notifier_free = nouveau_notifier_free;
nvws->notifier_reset = nouveau_notifier_reset;
nvws->notifier_status = nouveau_notifier_status;
nvws->notifier_retval = nouveau_notifier_return_val;
nvws->notifier_wait = nouveau_notifier_wait_status;
nvws->get_bo = nouveau_pipe_get_bo;
return nvws;
}