mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 03:08:05 +02:00
nv50: stop using nouveau_push.h, it's evil
This commit is contained in:
parent
ff8dff017e
commit
75f0b38d9e
6 changed files with 91 additions and 70 deletions
|
|
@ -31,6 +31,8 @@ nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
|||
unsigned clearValue)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
struct pipe_framebuffer_state fb, s_fb = nv50->framebuffer;
|
||||
struct pipe_scissor_state sc, s_sc = nv50->scissor;
|
||||
unsigned dirty = nv50->dirty;
|
||||
|
|
@ -59,21 +61,21 @@ nv50_clear(struct pipe_context *pipe, struct pipe_surface *ps,
|
|||
|
||||
switch (ps->format) {
|
||||
case PIPE_FORMAT_A8R8G8B8_UNORM:
|
||||
BEGIN_RING(tesla, 0x0d80, 4);
|
||||
OUT_RINGf (ubyte_to_float((clearValue >> 16) & 0xff));
|
||||
OUT_RINGf (ubyte_to_float((clearValue >> 8) & 0xff));
|
||||
OUT_RINGf (ubyte_to_float((clearValue >> 0) & 0xff));
|
||||
OUT_RINGf (ubyte_to_float((clearValue >> 24) & 0xff));
|
||||
BEGIN_RING(tesla, 0x19d0, 1);
|
||||
OUT_RING (0x3c);
|
||||
BEGIN_RING(chan, tesla, 0x0d80, 4);
|
||||
OUT_RINGf (chan, ubyte_to_float((clearValue >> 16) & 0xff));
|
||||
OUT_RINGf (chan, ubyte_to_float((clearValue >> 8) & 0xff));
|
||||
OUT_RINGf (chan, ubyte_to_float((clearValue >> 0) & 0xff));
|
||||
OUT_RINGf (chan, ubyte_to_float((clearValue >> 24) & 0xff));
|
||||
BEGIN_RING(chan, tesla, 0x19d0, 1);
|
||||
OUT_RING (chan, 0x3c);
|
||||
break;
|
||||
case PIPE_FORMAT_Z24S8_UNORM:
|
||||
BEGIN_RING(tesla, 0x0d90, 1);
|
||||
OUT_RINGf ((float)(clearValue >> 8) * (1.0 / 16777215.0));
|
||||
BEGIN_RING(tesla, 0x0da0, 1);
|
||||
OUT_RING (clearValue & 0xff);
|
||||
BEGIN_RING(tesla, 0x19d0, 1);
|
||||
OUT_RING (0x03);
|
||||
BEGIN_RING(chan, tesla, 0x0d90, 1);
|
||||
OUT_RINGf (chan, (float)(clearValue >> 8) * (1.0 / 16777215.0));
|
||||
BEGIN_RING(chan, tesla, 0x0da0, 1);
|
||||
OUT_RING (chan, clearValue & 0xff);
|
||||
BEGIN_RING(chan, tesla, 0x19d0, 1);
|
||||
OUT_RING (chan, 0x03);
|
||||
break;
|
||||
default:
|
||||
pipe->surface_fill(pipe, ps, 0, 0, ps->width, ps->height,
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ nv50_flush(struct pipe_context *pipe, unsigned flags,
|
|||
{
|
||||
struct nv50_context *nv50 = (struct nv50_context *)pipe;
|
||||
|
||||
FIRE_RING(fence);
|
||||
FIRE_RING(nv50->screen->nvws->channel);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -15,10 +15,6 @@
|
|||
#include "nouveau/nouveau_gldefs.h"
|
||||
#include "nouveau/nouveau_stateobj.h"
|
||||
|
||||
#define NOUVEAU_PUSH_CONTEXT(ctx) \
|
||||
struct nv50_screen *ctx = nv50->screen
|
||||
#include "nouveau/nouveau_push.h"
|
||||
|
||||
#include "nv50_screen.h"
|
||||
#include "nv50_program.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -1545,13 +1545,16 @@ static void
|
|||
nv50_program_upload_data(struct nv50_context *nv50, float *map,
|
||||
unsigned start, unsigned count)
|
||||
{
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
|
||||
while (count) {
|
||||
unsigned nr = count > 2047 ? 2047 : count;
|
||||
|
||||
BEGIN_RING(tesla, 0x00000f00, 1);
|
||||
OUT_RING ((NV50_CB_PMISC << 0) | (start << 8));
|
||||
BEGIN_RING(tesla, 0x40000f04, nr);
|
||||
OUT_RINGp (map, nr);
|
||||
BEGIN_RING(chan, tesla, 0x00000f00, 1);
|
||||
OUT_RING (chan, (NV50_CB_PMISC << 0) | (start << 8));
|
||||
BEGIN_RING(chan, tesla, 0x40000f04, nr);
|
||||
OUT_RINGp (chan, map, nr);
|
||||
|
||||
map += nr;
|
||||
start += nr;
|
||||
|
|
@ -1598,6 +1601,8 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
|
|||
static void
|
||||
nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
|
||||
{
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
struct pipe_winsys *ws = nv50->pipe.winsys;
|
||||
struct nv50_program_exec *e;
|
||||
struct nouveau_stateobj *so;
|
||||
|
|
@ -1664,14 +1669,14 @@ nv50_program_validate_code(struct nv50_context *nv50, struct nv50_program *p)
|
|||
nr = MIN2(count, 2047);
|
||||
nr = MIN2(nvws->channel->pushbuf->remaining, nr);
|
||||
if (nvws->channel->pushbuf->remaining < (nr + 3)) {
|
||||
FIRE_RING(NULL);
|
||||
FIRE_RING(chan);
|
||||
continue;
|
||||
}
|
||||
|
||||
BEGIN_RING(tesla, 0x0f00, 1);
|
||||
OUT_RING ((start << 8) | NV50_CB_PUPLOAD);
|
||||
BEGIN_RING(tesla, 0x40000f04, nr);
|
||||
OUT_RINGp (up + start, nr);
|
||||
BEGIN_RING(chan, tesla, 0x0f00, 1);
|
||||
OUT_RING (chan, (start << 8) | NV50_CB_PUPLOAD);
|
||||
BEGIN_RING(chan, tesla, 0x40000f04, nr);
|
||||
OUT_RINGp (chan, up + start, nr);
|
||||
|
||||
start += nr;
|
||||
count -= nr;
|
||||
|
|
|
|||
|
|
@ -71,12 +71,14 @@ static void
|
|||
nv50_query_begin(struct pipe_context *pipe, struct pipe_query *pq)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
struct nv50_query *q = nv50_query(pq);
|
||||
|
||||
BEGIN_RING(tesla, 0x1530, 1);
|
||||
OUT_RING (1);
|
||||
BEGIN_RING(tesla, 0x1514, 1);
|
||||
OUT_RING (1);
|
||||
BEGIN_RING(chan, tesla, 0x1530, 1);
|
||||
OUT_RING (chan, 1);
|
||||
BEGIN_RING(chan, tesla, 0x1514, 1);
|
||||
OUT_RING (chan, 1);
|
||||
|
||||
q->ready = FALSE;
|
||||
}
|
||||
|
|
@ -85,14 +87,17 @@ static void
|
|||
nv50_query_end(struct pipe_context *pipe, struct pipe_query *pq)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
struct nv50_query *q = nv50_query(pq);
|
||||
|
||||
BEGIN_RING(tesla, 0x1b00, 4);
|
||||
OUT_RELOCh(q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
|
||||
OUT_RELOCl(q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
|
||||
OUT_RING (0x00000000);
|
||||
OUT_RING (0x0100f002);
|
||||
FIRE_RING (NULL);
|
||||
WAIT_RING (chan, 5);
|
||||
BEGIN_RING(chan, tesla, 0x1b00, 4);
|
||||
OUT_RELOCh(chan, q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
|
||||
OUT_RELOCl(chan, q->buffer, 0, NOUVEAU_BO_VRAM | NOUVEAU_BO_WR);
|
||||
OUT_RING (chan, 0x00000000);
|
||||
OUT_RING (chan, 0x0100f002);
|
||||
FIRE_RING (chan);
|
||||
}
|
||||
|
||||
static boolean
|
||||
|
|
|
|||
|
|
@ -53,25 +53,27 @@ nv50_draw_arrays(struct pipe_context *pipe, unsigned mode, unsigned start,
|
|||
unsigned count)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
|
||||
nv50_state_validate(nv50);
|
||||
|
||||
BEGIN_RING(tesla, 0x142c, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(tesla, 0x142c, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(tesla, 0x1440, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(tesla, 0x1334, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(chan, tesla, 0x142c, 1);
|
||||
OUT_RING (chan, 0);
|
||||
BEGIN_RING(chan, tesla, 0x142c, 1);
|
||||
OUT_RING (chan, 0);
|
||||
BEGIN_RING(chan, tesla, 0x1440, 1);
|
||||
OUT_RING (chan, 0);
|
||||
BEGIN_RING(chan, tesla, 0x1334, 1);
|
||||
OUT_RING (chan, 0);
|
||||
|
||||
BEGIN_RING(tesla, NV50TCL_VERTEX_BEGIN, 1);
|
||||
OUT_RING (nv50_prim(mode));
|
||||
BEGIN_RING(tesla, NV50TCL_VERTEX_BUFFER_FIRST, 2);
|
||||
OUT_RING (start);
|
||||
OUT_RING (count);
|
||||
BEGIN_RING(tesla, NV50TCL_VERTEX_END, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1);
|
||||
OUT_RING (chan, nv50_prim(mode));
|
||||
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BUFFER_FIRST, 2);
|
||||
OUT_RING (chan, start);
|
||||
OUT_RING (chan, count);
|
||||
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
|
||||
OUT_RING (chan, 0);
|
||||
|
||||
pipe->flush(pipe, 0, NULL);
|
||||
return TRUE;
|
||||
|
|
@ -81,11 +83,14 @@ static INLINE void
|
|||
nv50_draw_elements_inline_u08(struct nv50_context *nv50, uint8_t *map,
|
||||
unsigned start, unsigned count)
|
||||
{
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
|
||||
map += start;
|
||||
|
||||
if (count & 1) {
|
||||
BEGIN_RING(tesla, 0x15e8, 1);
|
||||
OUT_RING (map[0]);
|
||||
BEGIN_RING(chan, tesla, 0x15e8, 1);
|
||||
OUT_RING (chan, map[0]);
|
||||
map++;
|
||||
count--;
|
||||
}
|
||||
|
|
@ -94,9 +99,9 @@ nv50_draw_elements_inline_u08(struct nv50_context *nv50, uint8_t *map,
|
|||
unsigned nr = count > 2046 ? 2046 : count;
|
||||
int i;
|
||||
|
||||
BEGIN_RING(tesla, 0x400015f0, nr >> 1);
|
||||
BEGIN_RING(chan, tesla, 0x400015f0, nr >> 1);
|
||||
for (i = 0; i < nr; i += 2)
|
||||
OUT_RING ((map[1] << 16) | map[0]);
|
||||
OUT_RING (chan, (map[1] << 16) | map[0]);
|
||||
|
||||
count -= nr;
|
||||
map += nr;
|
||||
|
|
@ -107,11 +112,14 @@ static INLINE void
|
|||
nv50_draw_elements_inline_u16(struct nv50_context *nv50, uint16_t *map,
|
||||
unsigned start, unsigned count)
|
||||
{
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
|
||||
map += start;
|
||||
|
||||
if (count & 1) {
|
||||
BEGIN_RING(tesla, 0x15e8, 1);
|
||||
OUT_RING (map[0]);
|
||||
BEGIN_RING(chan, tesla, 0x15e8, 1);
|
||||
OUT_RING (chan, map[0]);
|
||||
map++;
|
||||
count--;
|
||||
}
|
||||
|
|
@ -120,9 +128,9 @@ nv50_draw_elements_inline_u16(struct nv50_context *nv50, uint16_t *map,
|
|||
unsigned nr = count > 2046 ? 2046 : count;
|
||||
int i;
|
||||
|
||||
BEGIN_RING(tesla, 0x400015f0, nr >> 1);
|
||||
BEGIN_RING(chan, tesla, 0x400015f0, nr >> 1);
|
||||
for (i = 0; i < nr; i += 2)
|
||||
OUT_RING ((map[1] << 16) | map[0]);
|
||||
OUT_RING (chan, (map[1] << 16) | map[0]);
|
||||
|
||||
count -= nr;
|
||||
map += nr;
|
||||
|
|
@ -133,13 +141,16 @@ static INLINE void
|
|||
nv50_draw_elements_inline_u32(struct nv50_context *nv50, uint8_t *map,
|
||||
unsigned start, unsigned count)
|
||||
{
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
|
||||
map += start;
|
||||
|
||||
while (count) {
|
||||
unsigned nr = count > 2047 ? 2047 : count;
|
||||
|
||||
BEGIN_RING(tesla, 0x400015e8, nr);
|
||||
OUT_RINGp (map, nr);
|
||||
BEGIN_RING(chan, tesla, 0x400015e8, nr);
|
||||
OUT_RINGp (chan, map, nr);
|
||||
|
||||
count -= nr;
|
||||
map += nr;
|
||||
|
|
@ -152,18 +163,20 @@ nv50_draw_elements(struct pipe_context *pipe,
|
|||
unsigned mode, unsigned start, unsigned count)
|
||||
{
|
||||
struct nv50_context *nv50 = nv50_context(pipe);
|
||||
struct nouveau_channel *chan = nv50->screen->nvws->channel;
|
||||
struct nouveau_grobj *tesla = nv50->screen->tesla;
|
||||
struct pipe_winsys *ws = pipe->winsys;
|
||||
void *map = ws->buffer_map(ws, indexBuffer, PIPE_BUFFER_USAGE_CPU_READ);
|
||||
|
||||
nv50_state_validate(nv50);
|
||||
|
||||
BEGIN_RING(tesla, 0x142c, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(tesla, 0x142c, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(chan, tesla, 0x142c, 1);
|
||||
OUT_RING (chan, 0);
|
||||
BEGIN_RING(chan, tesla, 0x142c, 1);
|
||||
OUT_RING (chan, 0);
|
||||
|
||||
BEGIN_RING(tesla, NV50TCL_VERTEX_BEGIN, 1);
|
||||
OUT_RING (nv50_prim(mode));
|
||||
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_BEGIN, 1);
|
||||
OUT_RING (chan, nv50_prim(mode));
|
||||
switch (indexSize) {
|
||||
case 1:
|
||||
nv50_draw_elements_inline_u08(nv50, map, start, count);
|
||||
|
|
@ -177,8 +190,8 @@ nv50_draw_elements(struct pipe_context *pipe,
|
|||
default:
|
||||
assert(0);
|
||||
}
|
||||
BEGIN_RING(tesla, NV50TCL_VERTEX_END, 1);
|
||||
OUT_RING (0);
|
||||
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
|
||||
OUT_RING (chan, 0);
|
||||
|
||||
pipe->flush(pipe, 0, NULL);
|
||||
return TRUE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue