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:
parent
d4d584b16e
commit
1b207d9bb8
|
@ -4,6 +4,7 @@
|
||||||
struct nouveau_screen {
|
struct nouveau_screen {
|
||||||
struct pipe_screen base;
|
struct pipe_screen base;
|
||||||
struct nouveau_device *device;
|
struct nouveau_device *device;
|
||||||
|
struct nouveau_channel *channel;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline struct nouveau_screen *
|
static inline struct nouveau_screen *
|
||||||
|
|
|
@ -27,33 +27,6 @@ struct nouveau_winsys {
|
||||||
struct pipe_winsys *ws;
|
struct pipe_winsys *ws;
|
||||||
|
|
||||||
struct nouveau_channel *channel;
|
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 *
|
extern struct pipe_screen *
|
||||||
|
|
|
@ -105,10 +105,9 @@ static void
|
||||||
nv04_screen_destroy(struct pipe_screen *pscreen)
|
nv04_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv04_screen *screen = nv04_screen(pscreen);
|
struct nv04_screen *screen = nv04_screen(pscreen);
|
||||||
struct nouveau_winsys *nvws = screen->nvws;
|
|
||||||
|
|
||||||
nvws->notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nvws->grobj_free(&screen->fahrenheit);
|
nouveau_grobj_free(&screen->fahrenheit);
|
||||||
nv04_surface_2d_takedown(&screen->eng2d);
|
nv04_surface_2d_takedown(&screen->eng2d);
|
||||||
|
|
||||||
FREE(pscreen);
|
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 nv04_screen *screen = CALLOC_STRUCT(nv04_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
unsigned fahrenheit_class = 0, sub3d_class = 0;
|
unsigned fahrenheit_class = 0, sub3d_class = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -135,6 +135,13 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
pscreen = &screen->base.base;
|
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;
|
screen->nvws = nvws;
|
||||||
|
|
||||||
pscreen->winsys = ws;
|
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_miptree_functions(pscreen);
|
||||||
nv04_screen_init_transfer_functions(pscreen);
|
nv04_screen_init_transfer_functions(pscreen);
|
||||||
nouveau_screen_init(&screen->base, dev);
|
|
||||||
|
|
||||||
if (dev->chipset >= 0x20) {
|
if (dev->chipset >= 0x20) {
|
||||||
fahrenheit_class = 0;
|
fahrenheit_class = 0;
|
||||||
|
@ -163,26 +169,30 @@ nv04_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 2D engine setup */
|
|
||||||
screen->eng2d = nv04_surface_2d_init(nvws);
|
|
||||||
screen->eng2d->buf = nv04_surface_buffer;
|
|
||||||
|
|
||||||
/* 3D object */
|
/* 3D object */
|
||||||
ret = nvws->grobj_alloc(nvws, fahrenheit_class, &screen->fahrenheit);
|
ret = nouveau_grobj_alloc(chan, 0xbeef0001, fahrenheit_class,
|
||||||
|
&screen->fahrenheit);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
BIND_RING(chan, screen->fahrenheit, 7);
|
||||||
|
|
||||||
/* 3D surface object */
|
/* 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) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D surface object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D surface object: %d\n", ret);
|
||||||
return NULL;
|
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 */
|
/* Notifier for sync purposes */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv04_screen_destroy(pscreen);
|
nv04_screen_destroy(pscreen);
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#include "nouveau/nouveau_winsys.h"
|
#include "nouveau/nouveau_winsys.h"
|
||||||
#include "nouveau/nouveau_util.h"
|
#include "nouveau/nouveau_util.h"
|
||||||
|
#include "nouveau/nouveau_screen.h"
|
||||||
#include "nv04_surface_2d.h"
|
#include "nv04_surface_2d.h"
|
||||||
|
|
||||||
static INLINE int
|
static INLINE int
|
||||||
|
|
|
@ -102,10 +102,9 @@ static void
|
||||||
nv10_screen_destroy(struct pipe_screen *pscreen)
|
nv10_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv10_screen *screen = nv10_screen(pscreen);
|
struct nv10_screen *screen = nv10_screen(pscreen);
|
||||||
struct nouveau_winsys *nvws = screen->nvws;
|
|
||||||
|
|
||||||
nvws->notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nvws->grobj_free(&screen->celsius);
|
nouveau_grobj_free(&screen->celsius);
|
||||||
|
|
||||||
FREE(pscreen);
|
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 nv10_screen *screen = CALLOC_STRUCT(nv10_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
unsigned celsius_class;
|
unsigned celsius_class;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -131,6 +131,13 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
pscreen = &screen->base.base;
|
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;
|
screen->nvws = nvws;
|
||||||
|
|
||||||
pscreen->winsys = ws;
|
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_miptree_functions(pscreen);
|
||||||
nv10_screen_init_transfer_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 */
|
/* 3D object */
|
||||||
if (dev->chipset >= 0x20)
|
if (dev->chipset >= 0x20)
|
||||||
|
@ -162,14 +164,20 @@ nv10_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->grobj_alloc(nvws, celsius_class, &screen->celsius);
|
ret = nouveau_grobj_alloc(chan, 0xbeef0001, celsius_class,
|
||||||
|
&screen->celsius);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
return FALSE;
|
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 */
|
/* Notifier for sync purposes */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv10_screen_destroy(pscreen);
|
nv10_screen_destroy(pscreen);
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "pipe/p_screen.h"
|
#include "pipe/p_screen.h"
|
||||||
#include "util/u_simple_screen.h"
|
|
||||||
|
|
||||||
#include "nv20_context.h"
|
#include "nv20_context.h"
|
||||||
#include "nv20_screen.h"
|
#include "nv20_screen.h"
|
||||||
|
@ -103,10 +102,9 @@ static void
|
||||||
nv20_screen_destroy(struct pipe_screen *pscreen)
|
nv20_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv20_screen *screen = nv20_screen(pscreen);
|
struct nv20_screen *screen = nv20_screen(pscreen);
|
||||||
struct nouveau_winsys *nvws = screen->nvws;
|
|
||||||
|
|
||||||
nvws->notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nvws->grobj_free(&screen->kelvin);
|
nouveau_grobj_free(&screen->kelvin);
|
||||||
|
|
||||||
FREE(pscreen);
|
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 nv20_screen *screen = CALLOC_STRUCT(nv20_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
unsigned kelvin_class = 0;
|
unsigned kelvin_class = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -132,6 +131,13 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
pscreen = &screen->base.base;
|
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;
|
screen->nvws = nvws;
|
||||||
|
|
||||||
pscreen->winsys = ws;
|
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_miptree_functions(pscreen);
|
||||||
nv20_screen_init_transfer_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 */
|
/* 3D object */
|
||||||
if (dev->chipset >= 0x25)
|
if (dev->chipset >= 0x25)
|
||||||
|
@ -159,14 +160,20 @@ nv20_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->grobj_alloc(nvws, kelvin_class, &screen->kelvin);
|
ret = nouveau_grobj_alloc(chan, 0xbeef0097, kelvin_class,
|
||||||
|
&screen->kelvin);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
return FALSE;
|
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 */
|
/* Notifier for sync purposes */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv20_screen_destroy(pscreen);
|
nv20_screen_destroy(pscreen);
|
||||||
|
|
|
@ -29,11 +29,10 @@ nv30_query_create(struct pipe_context *pipe, unsigned query_type)
|
||||||
static void
|
static void
|
||||||
nv30_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
|
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);
|
struct nv30_query *q = nv30_query(pq);
|
||||||
|
|
||||||
if (q->object)
|
if (q->object)
|
||||||
nv30->nvws->res_free(&q->object);
|
nouveau_resource_free(&q->object);
|
||||||
FREE(q);
|
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);
|
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);
|
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);
|
BEGIN_RING(rankine, NV34TCL_QUERY_RESET, 1);
|
||||||
OUT_RING (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_context *nv30 = nv30_context(pipe);
|
||||||
struct nv30_query *q = nv30_query(pq);
|
struct nv30_query *q = nv30_query(pq);
|
||||||
struct nouveau_winsys *nvws = nv30->nvws;
|
|
||||||
|
|
||||||
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
|
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
|
||||||
|
|
||||||
if (!q->ready) {
|
if (!q->ready) {
|
||||||
unsigned status;
|
unsigned status;
|
||||||
|
|
||||||
status = nvws->notifier_status(nv30->screen->query,
|
status = nouveau_notifier_status(nv30->screen->query,
|
||||||
q->object->start);
|
q->object->start);
|
||||||
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
|
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
|
||||||
if (wait == FALSE)
|
if (wait == FALSE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
nvws->notifier_wait(nv30->screen->query, q->object->start,
|
|
||||||
NV_NOTIFY_STATE_STATUS_COMPLETED,
|
nouveau_notifier_wait_status(nv30->screen->query,
|
||||||
0);
|
q->object->start,
|
||||||
|
NV_NOTIFY_STATE_STATUS_COMPLETED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
q->result = nvws->notifier_retval(nv30->screen->query,
|
q->result = nouveau_notifier_return_val(nv30->screen->query,
|
||||||
q->object->start);
|
q->object->start);
|
||||||
q->ready = TRUE;
|
q->ready = TRUE;
|
||||||
nvws->res_free(&q->object);
|
nouveau_resource_free(&q->object);
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = q->result;
|
*result = q->result;
|
||||||
|
|
|
@ -124,14 +124,13 @@ static void
|
||||||
nv30_screen_destroy(struct pipe_screen *pscreen)
|
nv30_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv30_screen *screen = nv30_screen(pscreen);
|
struct nv30_screen *screen = nv30_screen(pscreen);
|
||||||
struct nouveau_winsys *nvws = screen->nvws;
|
|
||||||
|
|
||||||
nvws->res_free(&screen->vp_exec_heap);
|
nouveau_resource_free(&screen->vp_exec_heap);
|
||||||
nvws->res_free(&screen->vp_data_heap);
|
nouveau_resource_free(&screen->vp_data_heap);
|
||||||
nvws->res_free(&screen->query_heap);
|
nouveau_resource_free(&screen->query_heap);
|
||||||
nvws->notifier_free(&screen->query);
|
nouveau_notifier_free(&screen->query);
|
||||||
nvws->notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nvws->grobj_free(&screen->rankine);
|
nouveau_grobj_free(&screen->rankine);
|
||||||
|
|
||||||
FREE(pscreen);
|
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 nv30_screen *screen = CALLOC_STRUCT(nv30_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
struct nouveau_stateobj *so;
|
struct nouveau_stateobj *so;
|
||||||
unsigned rankine_class = 0;
|
unsigned rankine_class = 0;
|
||||||
|
@ -150,6 +150,13 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
pscreen = &screen->base.base;
|
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;
|
screen->nvws = nvws;
|
||||||
|
|
||||||
pscreen->winsys = ws;
|
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_miptree_functions(pscreen);
|
||||||
nv30_screen_init_transfer_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 */
|
/* 3D object */
|
||||||
switch (dev->chipset & 0xf0) {
|
switch (dev->chipset & 0xf0) {
|
||||||
|
@ -187,14 +189,20 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->grobj_alloc(nvws, rankine_class, &screen->rankine);
|
ret = nouveau_grobj_alloc(chan, 0xbeef3097, rankine_class,
|
||||||
|
&screen->rankine);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
return FALSE;
|
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 */
|
/* Notifier for sync purposes */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv30_screen_destroy(pscreen);
|
nv30_screen_destroy(pscreen);
|
||||||
|
@ -202,14 +210,14 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query objects */
|
/* Query objects */
|
||||||
ret = nvws->notifier_alloc(nvws, 32, &screen->query);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
|
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
|
||||||
nv30_screen_destroy(pscreen);
|
nv30_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->res_init(&screen->query_heap, 0, 32);
|
ret = nouveau_resource_init(&screen->query_heap, 0, 32);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
|
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
|
||||||
nv30_screen_destroy(pscreen);
|
nv30_screen_destroy(pscreen);
|
||||||
|
@ -217,8 +225,8 @@ nv30_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vtxprog resources */
|
/* Vtxprog resources */
|
||||||
if (nvws->res_init(&screen->vp_exec_heap, 0, 256) ||
|
if (nouveau_resource_init(&screen->vp_exec_heap, 0, 256) ||
|
||||||
nvws->res_init(&screen->vp_data_heap, 0, 256)) {
|
nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
|
||||||
nv30_screen_destroy(pscreen);
|
nv30_screen_destroy(pscreen);
|
||||||
return NULL;
|
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_method(so, screen->rankine, NV34TCL_DMA_NOTIFY, 1);
|
||||||
so_data (so, screen->sync->handle);
|
so_data (so, screen->sync->handle);
|
||||||
so_method(so, screen->rankine, NV34TCL_DMA_TEXTURE0, 2);
|
so_method(so, screen->rankine, NV34TCL_DMA_TEXTURE0, 2);
|
||||||
so_data (so, nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, nvws->channel->gart->handle);
|
so_data (so, chan->gart->handle);
|
||||||
so_method(so, screen->rankine, NV34TCL_DMA_COLOR1, 1);
|
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_method(so, screen->rankine, NV34TCL_DMA_COLOR0, 2);
|
||||||
so_data (so, nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_method(so, screen->rankine, NV34TCL_DMA_VTXBUF0, 2);
|
so_method(so, screen->rankine, NV34TCL_DMA_VTXBUF0, 2);
|
||||||
so_data (so, nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, nvws->channel->gart->handle);
|
so_data (so, chan->gart->handle);
|
||||||
/* so_method(so, screen->rankine, NV34TCL_DMA_FENCE, 2);
|
/* so_method(so, screen->rankine, NV34TCL_DMA_FENCE, 2);
|
||||||
so_data (so, 0);
|
so_data (so, 0);
|
||||||
so_data (so, screen->query->handle);*/
|
so_data (so, screen->query->handle);*/
|
||||||
so_method(so, screen->rankine, NV34TCL_DMA_IN_MEMORY7, 1);
|
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_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++) {
|
for (i=1; i<8; i++) {
|
||||||
so_method(so, screen->rankine, NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1);
|
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_emit(nvws, so);
|
||||||
so_ref(NULL, &so);
|
so_ref(NULL, &so);
|
||||||
nouveau_pushbuf_flush(nvws->channel, 0);
|
nouveau_pushbuf_flush(chan, 0);
|
||||||
|
|
||||||
return pscreen;
|
return pscreen;
|
||||||
}
|
}
|
||||||
|
|
|
@ -645,7 +645,6 @@ out_err:
|
||||||
static boolean
|
static boolean
|
||||||
nv30_vertprog_validate(struct nv30_context *nv30)
|
nv30_vertprog_validate(struct nv30_context *nv30)
|
||||||
{
|
{
|
||||||
struct nouveau_winsys *nvws = nv30->nvws;
|
|
||||||
struct pipe_winsys *ws = nv30->pipe.winsys;
|
struct pipe_winsys *ws = nv30->pipe.winsys;
|
||||||
struct nouveau_grobj *rankine = nv30->screen->rankine;
|
struct nouveau_grobj *rankine = nv30->screen->rankine;
|
||||||
struct nv30_vertex_program *vp;
|
struct nv30_vertex_program *vp;
|
||||||
|
@ -669,15 +668,15 @@ nv30_vertprog_validate(struct nv30_context *nv30)
|
||||||
struct nouveau_stateobj *so;
|
struct nouveau_stateobj *so;
|
||||||
uint vplen = vp->nr_insns;
|
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) {
|
while (heap->next && heap->size < vplen) {
|
||||||
struct nv30_vertex_program *evict;
|
struct nv30_vertex_program *evict;
|
||||||
|
|
||||||
evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -694,15 +693,16 @@ nv30_vertprog_validate(struct nv30_context *nv30)
|
||||||
if (vp->nr_consts && !vp->data) {
|
if (vp->nr_consts && !vp->data) {
|
||||||
struct nouveau_resource *heap = nv30->screen->vp_data_heap;
|
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) {
|
while (heap->next && heap->size < vp->nr_consts) {
|
||||||
struct nv30_vertex_program *evict;
|
struct nv30_vertex_program *evict;
|
||||||
|
|
||||||
evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -804,8 +804,6 @@ nv30_vertprog_validate(struct nv30_context *nv30)
|
||||||
void
|
void
|
||||||
nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
|
nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
|
||||||
{
|
{
|
||||||
struct nouveau_winsys *nvws = nv30->screen->nvws;
|
|
||||||
|
|
||||||
vp->translated = FALSE;
|
vp->translated = FALSE;
|
||||||
|
|
||||||
if (vp->nr_insns) {
|
if (vp->nr_insns) {
|
||||||
|
@ -820,9 +818,9 @@ nv30_vertprog_destroy(struct nv30_context *nv30, struct nv30_vertex_program *vp)
|
||||||
vp->nr_consts = 0;
|
vp->nr_consts = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvws->res_free(&vp->exec);
|
nouveau_resource_free(&vp->exec);
|
||||||
vp->exec_start = 0;
|
vp->exec_start = 0;
|
||||||
nvws->res_free(&vp->data);
|
nouveau_resource_free(&vp->data);
|
||||||
vp->data_start = 0;
|
vp->data_start = 0;
|
||||||
vp->data_start_min = 0;
|
vp->data_start_min = 0;
|
||||||
|
|
||||||
|
|
|
@ -29,11 +29,10 @@ nv40_query_create(struct pipe_context *pipe, unsigned query_type)
|
||||||
static void
|
static void
|
||||||
nv40_query_destroy(struct pipe_context *pipe, struct pipe_query *pq)
|
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);
|
struct nv40_query *q = nv40_query(pq);
|
||||||
|
|
||||||
if (q->object)
|
if (q->object)
|
||||||
nv40->nvws->res_free(&q->object);
|
nouveau_resource_free(&q->object);
|
||||||
FREE(q);
|
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);
|
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);
|
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);
|
BEGIN_RING(curie, NV40TCL_QUERY_RESET, 1);
|
||||||
OUT_RING (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_context *nv40 = nv40_context(pipe);
|
||||||
struct nv40_query *q = nv40_query(pq);
|
struct nv40_query *q = nv40_query(pq);
|
||||||
struct nouveau_winsys *nvws = nv40->nvws;
|
|
||||||
|
|
||||||
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
|
assert(q->object && q->type == PIPE_QUERY_OCCLUSION_COUNTER);
|
||||||
|
|
||||||
if (!q->ready) {
|
if (!q->ready) {
|
||||||
unsigned status;
|
unsigned status;
|
||||||
|
|
||||||
status = nvws->notifier_status(nv40->screen->query,
|
status = nouveau_notifier_status(nv40->screen->query,
|
||||||
q->object->start);
|
q->object->start);
|
||||||
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
|
if (status != NV_NOTIFY_STATE_STATUS_COMPLETED) {
|
||||||
if (wait == FALSE)
|
if (wait == FALSE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
nvws->notifier_wait(nv40->screen->query, q->object->start,
|
nouveau_notifier_wait_status(nv40->screen->query,
|
||||||
|
q->object->start,
|
||||||
NV_NOTIFY_STATE_STATUS_COMPLETED,
|
NV_NOTIFY_STATE_STATUS_COMPLETED,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
q->result = nvws->notifier_retval(nv40->screen->query,
|
q->result = nouveau_notifier_return_val(nv40->screen->query,
|
||||||
q->object->start);
|
q->object->start);
|
||||||
q->ready = TRUE;
|
q->ready = TRUE;
|
||||||
nvws->res_free(&q->object);
|
nouveau_resource_free(&q->object);
|
||||||
}
|
}
|
||||||
|
|
||||||
*result = q->result;
|
*result = q->result;
|
||||||
|
|
|
@ -130,14 +130,13 @@ static void
|
||||||
nv40_screen_destroy(struct pipe_screen *pscreen)
|
nv40_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv40_screen *screen = nv40_screen(pscreen);
|
struct nv40_screen *screen = nv40_screen(pscreen);
|
||||||
struct nouveau_winsys *nvws = screen->nvws;
|
|
||||||
|
|
||||||
nvws->res_free(&screen->vp_exec_heap);
|
nouveau_resource_free(&screen->vp_exec_heap);
|
||||||
nvws->res_free(&screen->vp_data_heap);
|
nouveau_resource_free(&screen->vp_data_heap);
|
||||||
nvws->res_free(&screen->query_heap);
|
nouveau_resource_free(&screen->query_heap);
|
||||||
nvws->notifier_free(&screen->query);
|
nouveau_notifier_free(&screen->query);
|
||||||
nvws->notifier_free(&screen->sync);
|
nouveau_notifier_free(&screen->sync);
|
||||||
nvws->grobj_free(&screen->curie);
|
nouveau_grobj_free(&screen->curie);
|
||||||
|
|
||||||
nouveau_screen_fini(&screen->base);
|
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 nv40_screen *screen = CALLOC_STRUCT(nv40_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
struct nouveau_stateobj *so;
|
struct nouveau_stateobj *so;
|
||||||
unsigned curie_class = 0;
|
unsigned curie_class = 0;
|
||||||
|
@ -158,6 +158,13 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
pscreen = &screen->base.base;
|
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;
|
screen->nvws = nvws;
|
||||||
|
|
||||||
pscreen->winsys = ws;
|
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_miptree_functions(pscreen);
|
||||||
nv40_screen_init_transfer_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 */
|
/* 3D object */
|
||||||
switch (dev->chipset & 0xf0) {
|
switch (dev->chipset & 0xf0) {
|
||||||
|
@ -194,14 +196,19 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->grobj_alloc(nvws, curie_class, &screen->curie);
|
ret = nouveau_grobj_alloc(chan, 0xbeef3097, curie_class, &screen->curie);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
return FALSE;
|
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 */
|
/* Notifier for sync purposes */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv40_screen_destroy(pscreen);
|
nv40_screen_destroy(pscreen);
|
||||||
|
@ -209,14 +216,14 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Query objects */
|
/* Query objects */
|
||||||
ret = nvws->notifier_alloc(nvws, 32, &screen->query);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0302, 32, &screen->query);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
|
NOUVEAU_ERR("Error initialising query objects: %d\n", ret);
|
||||||
nv40_screen_destroy(pscreen);
|
nv40_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->res_init(&screen->query_heap, 0, 32);
|
nouveau_resource_init(&screen->query_heap, 0, 32);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
|
NOUVEAU_ERR("Error initialising query object heap: %d\n", ret);
|
||||||
nv40_screen_destroy(pscreen);
|
nv40_screen_destroy(pscreen);
|
||||||
|
@ -224,8 +231,8 @@ nv40_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vtxprog resources */
|
/* Vtxprog resources */
|
||||||
if (nvws->res_init(&screen->vp_exec_heap, 0, 512) ||
|
if (nouveau_resource_init(&screen->vp_exec_heap, 0, 512) ||
|
||||||
nvws->res_init(&screen->vp_data_heap, 0, 256)) {
|
nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
|
||||||
nv40_screen_destroy(pscreen);
|
nv40_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -855,7 +855,6 @@ out_err:
|
||||||
static boolean
|
static boolean
|
||||||
nv40_vertprog_validate(struct nv40_context *nv40)
|
nv40_vertprog_validate(struct nv40_context *nv40)
|
||||||
{
|
{
|
||||||
struct nouveau_winsys *nvws = nv40->nvws;
|
|
||||||
struct pipe_winsys *ws = nv40->pipe.winsys;
|
struct pipe_winsys *ws = nv40->pipe.winsys;
|
||||||
struct nouveau_grobj *curie = nv40->screen->curie;
|
struct nouveau_grobj *curie = nv40->screen->curie;
|
||||||
struct nv40_vertex_program *vp;
|
struct nv40_vertex_program *vp;
|
||||||
|
@ -895,15 +894,15 @@ check_gpu_resources:
|
||||||
struct nouveau_stateobj *so;
|
struct nouveau_stateobj *so;
|
||||||
uint vplen = vp->nr_insns;
|
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) {
|
while (heap->next && heap->size < vplen) {
|
||||||
struct nv40_vertex_program *evict;
|
struct nv40_vertex_program *evict;
|
||||||
|
|
||||||
evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -925,15 +924,15 @@ check_gpu_resources:
|
||||||
if (vp->nr_consts && !vp->data) {
|
if (vp->nr_consts && !vp->data) {
|
||||||
struct nouveau_resource *heap = nv40->screen->vp_data_heap;
|
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) {
|
while (heap->next && heap->size < vp->nr_consts) {
|
||||||
struct nv40_vertex_program *evict;
|
struct nv40_vertex_program *evict;
|
||||||
|
|
||||||
evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1035,8 +1034,6 @@ check_gpu_resources:
|
||||||
void
|
void
|
||||||
nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
|
nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
|
||||||
{
|
{
|
||||||
struct nouveau_winsys *nvws = nv40->screen->nvws;
|
|
||||||
|
|
||||||
vp->translated = FALSE;
|
vp->translated = FALSE;
|
||||||
|
|
||||||
if (vp->nr_insns) {
|
if (vp->nr_insns) {
|
||||||
|
@ -1051,9 +1048,9 @@ nv40_vertprog_destroy(struct nv40_context *nv40, struct nv40_vertex_program *vp)
|
||||||
vp->nr_consts = 0;
|
vp->nr_consts = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
nvws->res_free(&vp->exec);
|
nouveau_resource_free(&vp->exec);
|
||||||
vp->exec_start = 0;
|
vp->exec_start = 0;
|
||||||
nvws->res_free(&vp->data);
|
nouveau_resource_free(&vp->data);
|
||||||
vp->data_start = 0;
|
vp->data_start = 0;
|
||||||
vp->data_start_min = 0;
|
vp->data_start_min = 0;
|
||||||
|
|
||||||
|
|
|
@ -2241,13 +2241,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
|
||||||
if (!p->data[0] && p->immd_nr) {
|
if (!p->data[0] && p->immd_nr) {
|
||||||
struct nouveau_resource *heap = nv50->screen->immd_heap[0];
|
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) {
|
while (heap->next && heap->size < p->immd_nr) {
|
||||||
struct nv50_program *evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2260,13 +2261,14 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
|
||||||
struct nouveau_resource *heap =
|
struct nouveau_resource *heap =
|
||||||
nv50->screen->parm_heap[p->type];
|
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) {
|
while (heap->next && heap->size < p->param_nr) {
|
||||||
struct nv50_program *evict = heap->next->priv;
|
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);
|
assert(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2472,8 +2474,8 @@ nv50_program_destroy(struct nv50_context *nv50, struct nv50_program *p)
|
||||||
|
|
||||||
nouveau_bo_ref(NULL, &p->bo);
|
nouveau_bo_ref(NULL, &p->bo);
|
||||||
|
|
||||||
nv50->screen->nvws->res_free(&p->data[0]);
|
nouveau_resource_free(&p->data[0]);
|
||||||
nv50->screen->nvws->res_free(&p->data[1]);
|
nouveau_resource_free(&p->data[1]);
|
||||||
|
|
||||||
p->translated = 0;
|
p->translated = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,6 +136,10 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
|
||||||
{
|
{
|
||||||
struct nv50_screen *screen = nv50_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);
|
nouveau_screen_fini(&screen->base);
|
||||||
FREE(screen);
|
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 nv50_screen *screen = CALLOC_STRUCT(nv50_screen);
|
||||||
struct nouveau_device *dev = nvws->channel->device;
|
struct nouveau_device *dev = nvws->channel->device;
|
||||||
|
struct nouveau_channel *chan;
|
||||||
struct pipe_screen *pscreen;
|
struct pipe_screen *pscreen;
|
||||||
struct nouveau_stateobj *so;
|
struct nouveau_stateobj *so;
|
||||||
unsigned chipset = dev->chipset;
|
unsigned chipset = dev->chipset;
|
||||||
|
@ -160,6 +165,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
nv50_screen_destroy(pscreen);
|
nv50_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
screen->base.channel = chan = nvws->channel;
|
||||||
|
|
||||||
/* Setup the pipe */
|
/* Setup the pipe */
|
||||||
screen->nvws = nvws;
|
screen->nvws = nvws;
|
||||||
|
@ -174,20 +180,22 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
nv50_transfer_init_screen_functions(pscreen);
|
nv50_transfer_init_screen_functions(pscreen);
|
||||||
|
|
||||||
/* DMA engine object */
|
/* DMA engine object */
|
||||||
ret = nvws->grobj_alloc(nvws, 0x5039, &screen->m2mf);
|
ret = nouveau_grobj_alloc(chan, 0xbeef5039, 0x5039, &screen->m2mf);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating M2MF object: %d\n", ret);
|
NOUVEAU_ERR("Error creating M2MF object: %d\n", ret);
|
||||||
nv50_screen_destroy(pscreen);
|
nv50_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
BIND_RING(chan, screen->m2mf, 1);
|
||||||
|
|
||||||
/* 2D object */
|
/* 2D object */
|
||||||
ret = nvws->grobj_alloc(nvws, NV50_2D, &screen->eng2d);
|
ret = nouveau_grobj_alloc(chan, 0xbeef502d, 0x502d, &screen->eng2d);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 2D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 2D object: %d\n", ret);
|
||||||
nv50_screen_destroy(pscreen);
|
nv50_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
BIND_RING(chan, screen->eng2d, 2);
|
||||||
|
|
||||||
/* 3D object */
|
/* 3D object */
|
||||||
switch (chipset & 0xf0) {
|
switch (chipset & 0xf0) {
|
||||||
|
@ -213,15 +221,16 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = nvws->grobj_alloc(nvws, tesla_class, &screen->tesla);
|
ret = nouveau_grobj_alloc(chan, 0xbeef5097, tesla_class, &screen->tesla);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
NOUVEAU_ERR("Error creating 3D object: %d\n", ret);
|
||||||
nv50_screen_destroy(pscreen);
|
nv50_screen_destroy(pscreen);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
BIND_RING(chan, screen->tesla, 3);
|
||||||
|
|
||||||
/* Sync notifier */
|
/* Sync notifier */
|
||||||
ret = nvws->notifier_alloc(nvws, 1, &screen->sync);
|
ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
NOUVEAU_ERR("Error creating notifier object: %d\n", ret);
|
||||||
nv50_screen_destroy(pscreen);
|
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 = so_new(32, 0);
|
||||||
so_method(so, screen->m2mf, 0x0180, 3);
|
so_method(so, screen->m2mf, 0x0180, 3);
|
||||||
so_data (so, screen->sync->handle);
|
so_data (so, screen->sync->handle);
|
||||||
so_data (so, screen->nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, screen->nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_emit(nvws, so);
|
so_emit(nvws, so);
|
||||||
so_ref (NULL, &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 = so_new(64, 0);
|
||||||
so_method(so, screen->eng2d, NV50_2D_DMA_NOTIFY, 4);
|
so_method(so, screen->eng2d, NV50_2D_DMA_NOTIFY, 4);
|
||||||
so_data (so, screen->sync->handle);
|
so_data (so, screen->sync->handle);
|
||||||
so_data (so, screen->nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, screen->nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_data (so, screen->nvws->channel->vram->handle);
|
so_data (so, chan->vram->handle);
|
||||||
so_method(so, screen->eng2d, NV50_2D_OPERATION, 1);
|
so_method(so, screen->eng2d, NV50_2D_OPERATION, 1);
|
||||||
so_data (so, NV50_2D_OPERATION_SRCCOPY);
|
so_data (so, NV50_2D_OPERATION_SRCCOPY);
|
||||||
so_method(so, screen->eng2d, 0x0290, 1);
|
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),
|
so_method(so, screen->tesla, NV50TCL_DMA_UNK0(0),
|
||||||
NV50TCL_DMA_UNK0__SIZE);
|
NV50TCL_DMA_UNK0__SIZE);
|
||||||
for (i = 0; i < NV50TCL_DMA_UNK0__SIZE; i++)
|
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),
|
so_method(so, screen->tesla, NV50TCL_DMA_UNK1(0),
|
||||||
NV50TCL_DMA_UNK1__SIZE);
|
NV50TCL_DMA_UNK1__SIZE);
|
||||||
for (i = 0; i < NV50TCL_DMA_UNK1__SIZE; i++)
|
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_method(so, screen->tesla, 0x121c, 1);
|
||||||
so_data (so, 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) ||
|
if (nouveau_resource_init(&screen->immd_heap[0], 0, 128) ||
|
||||||
nvws->res_init(&screen->parm_heap[0], 0, 128) ||
|
nouveau_resource_init(&screen->parm_heap[0], 0, 128) ||
|
||||||
nvws->res_init(&screen->parm_heap[1], 0, 128))
|
nouveau_resource_init(&screen->parm_heap[1], 0, 128))
|
||||||
{
|
{
|
||||||
NOUVEAU_ERR("Error initialising constant buffers.\n");
|
NOUVEAU_ERR("Error initialising constant buffers.\n");
|
||||||
nv50_screen_destroy(pscreen);
|
nv50_screen_destroy(pscreen);
|
||||||
|
@ -405,7 +414,7 @@ nv50_screen_create(struct pipe_winsys *ws, struct nouveau_winsys *nvws)
|
||||||
so_emit(nvws, so);
|
so_emit(nvws, so);
|
||||||
so_ref (so, &screen->static_init);
|
so_ref (so, &screen->static_init);
|
||||||
so_ref (NULL, &so);
|
so_ref (NULL, &so);
|
||||||
nouveau_pushbuf_flush(nvws->channel, 0);
|
nouveau_pushbuf_flush(chan, 0);
|
||||||
|
|
||||||
return pscreen;
|
return pscreen;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,40 +2,6 @@
|
||||||
|
|
||||||
#include "nouveau_winsys_pipe.h"
|
#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 *
|
struct nouveau_winsys *
|
||||||
nouveau_winsys_new(struct pipe_winsys *ws)
|
nouveau_winsys_new(struct pipe_winsys *ws)
|
||||||
{
|
{
|
||||||
|
@ -49,22 +15,6 @@ nouveau_winsys_new(struct pipe_winsys *ws)
|
||||||
nvws->ws = ws;
|
nvws->ws = ws;
|
||||||
nvws->channel = nvpws->channel;
|
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;
|
return nvws;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue