nouveau: remove unneeded code from ws, use pipe_buffer_ instead of ws->

This commit is contained in:
Ben Skeggs
2009-06-05 11:21:08 +10:00
parent 80e9e1ee81
commit 6b3ca672eb
24 changed files with 198 additions and 414 deletions
+4 -3
View File
@@ -2,6 +2,7 @@
#include "pipe/p_state.h"
#include "pipe/p_defines.h"
#include "pipe/p_shader_tokens.h"
#include "pipe/p_inlines.h"
#include "tgsi/tgsi_parse.h"
@@ -334,7 +335,7 @@ nv04_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
const struct pipe_constant_buffer *buf )
{
struct nv04_context *nv04 = nv04_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
assert(shader < PIPE_SHADER_TYPES);
assert(index == 0);
@@ -342,12 +343,12 @@ nv04_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
if (buf) {
void *mapped;
if (buf->buffer && buf->buffer->size &&
(mapped = ws->buffer_map(ws, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
(mapped = pipe_buffer_map(pscreen, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
{
memcpy(nv04->constbuf[shader], mapped, buf->buffer->size);
nv04->constbuf_nr[shader] =
buf->buffer->size / (4 * sizeof(float));
ws->buffer_unmap(ws, buf->buffer);
pipe_buffer_unmap(pscreen, buf->buffer);
}
}
}
+9 -7
View File
@@ -1,6 +1,7 @@
#include "draw/draw_context.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv04_context.h"
#include "nv04_state.h"
@@ -13,6 +14,7 @@ boolean nv04_draw_elements( struct pipe_context *pipe,
unsigned indexSize,
unsigned prim, unsigned start, unsigned count)
{
struct pipe_screen *pscreen = pipe->screen;
struct nv04_context *nv04 = nv04_context( pipe );
struct draw_context *draw = nv04->draw;
unsigned i;
@@ -25,17 +27,17 @@ boolean nv04_draw_elements( struct pipe_context *pipe,
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv04->vtxbuf[i].buffer) {
void *buf
= pipe->winsys->buffer_map(pipe->winsys,
nv04->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
= pipe_buffer_map(pscreen,
nv04->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_vertex_buffer(draw, i, buf);
}
}
/* Map index buffer, if present */
if (indexBuffer) {
void *mapped_indexes
= pipe->winsys->buffer_map(pipe->winsys, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
= pipe_buffer_map(pscreen, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer(draw, indexSize, mapped_indexes);
}
else {
@@ -55,12 +57,12 @@ boolean nv04_draw_elements( struct pipe_context *pipe,
*/
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv04->vtxbuf[i].buffer) {
pipe->winsys->buffer_unmap(pipe->winsys, nv04->vtxbuf[i].buffer);
pipe_buffer_unmap(pscreen, nv04->vtxbuf[i].buffer);
draw_set_mapped_vertex_buffer(draw, i, NULL);
}
}
if (indexBuffer) {
pipe->winsys->buffer_unmap(pipe->winsys, indexBuffer);
pipe_buffer_unmap(pscreen, indexBuffer);
draw_set_mapped_element_buffer(draw, 0, NULL);
}
+5 -9
View File
@@ -40,7 +40,6 @@
#include "util/u_debug.h"
#include "pipe/p_inlines.h"
#include "pipe/internal/p_winsys_screen.h"
#include "nv10_context.h"
#include "nv10_state.h"
@@ -124,11 +123,10 @@ nv10_vbuf_render_map_vertices( struct vbuf_render *render )
{
struct nv10_vbuf_render *nv10_render = nv10_vbuf_render(render);
struct nv10_context *nv10 = nv10_render->nv10;
struct pipe_winsys *winsys = nv10->pipe.winsys;
struct pipe_screen *pscreen = nv10->pipe.screen;
return winsys->buffer_map(winsys,
nv10_render->buffer,
PIPE_BUFFER_USAGE_CPU_WRITE);
return pipe_buffer_map(pscreen, nv10_render->buffer,
PIPE_BUFFER_USAGE_CPU_WRITE);
}
static void
@@ -138,10 +136,10 @@ nv10_vbuf_render_unmap_vertices( struct vbuf_render *render,
{
struct nv10_vbuf_render *nv10_render = nv10_vbuf_render(render);
struct nv10_context *nv10 = nv10_render->nv10;
struct pipe_winsys *winsys = nv10->pipe.winsys;
struct pipe_screen *pscreen = nv10->pipe.screen;
assert(!nv10_render->buffer);
winsys->buffer_unmap(winsys, nv10_render->buffer);
pipe_buffer_unmap(pscreen, nv10_render->buffer);
}
static boolean
@@ -202,8 +200,6 @@ static void
nv10_vbuf_render_release_vertices( struct vbuf_render *render )
{
struct nv10_vbuf_render *nv10_render = nv10_vbuf_render(render);
struct nv10_context *nv10 = nv10_render->nv10;
struct pipe_screen *pscreen = &nv10->screen->base.base;
assert(nv10_render->buffer);
pipe_buffer_reference(&nv10_render->buffer, NULL);
+4 -3
View File
@@ -2,6 +2,7 @@
#include "pipe/p_state.h"
#include "pipe/p_defines.h"
#include "pipe/p_shader_tokens.h"
#include "pipe/p_inlines.h"
#include "tgsi/tgsi_parse.h"
@@ -460,7 +461,7 @@ nv10_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
const struct pipe_constant_buffer *buf )
{
struct nv10_context *nv10 = nv10_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
assert(shader < PIPE_SHADER_TYPES);
assert(index == 0);
@@ -468,12 +469,12 @@ nv10_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
if (buf) {
void *mapped;
if (buf->buffer && buf->buffer->size &&
(mapped = ws->buffer_map(ws, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
(mapped = pipe_buffer_map(pscreen, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
{
memcpy(nv10->constbuf[shader], mapped, buf->buffer->size);
nv10->constbuf_nr[shader] =
buf->buffer->size / (4 * sizeof(float));
ws->buffer_unmap(ws, buf->buffer);
pipe_buffer_unmap(pscreen, buf->buffer);
}
}
}
+8 -7
View File
@@ -1,6 +1,7 @@
#include "draw/draw_context.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv10_context.h"
#include "nv10_state.h"
@@ -15,6 +16,7 @@ boolean nv10_draw_elements( struct pipe_context *pipe,
{
struct nv10_context *nv10 = nv10_context( pipe );
struct draw_context *draw = nv10->draw;
struct pipe_screen *pscreen = pipe->screen;
unsigned i;
nv10_emit_hw_state(nv10);
@@ -24,9 +26,8 @@ boolean nv10_draw_elements( struct pipe_context *pipe,
*/
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv10->vtxbuf[i].buffer) {
void *buf
= pipe->winsys->buffer_map(pipe->winsys,
nv10->vtxbuf[i].buffer,
void *buf =
pipe_buffer_map(pscreen, nv10->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_vertex_buffer(draw, i, buf);
}
@@ -34,8 +35,8 @@ boolean nv10_draw_elements( struct pipe_context *pipe,
/* Map index buffer, if present */
if (indexBuffer) {
void *mapped_indexes
= pipe->winsys->buffer_map(pipe->winsys, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
= pipe_buffer_map(pscreen, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer(draw, indexSize, mapped_indexes);
}
else {
@@ -55,12 +56,12 @@ boolean nv10_draw_elements( struct pipe_context *pipe,
*/
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv10->vtxbuf[i].buffer) {
pipe->winsys->buffer_unmap(pipe->winsys, nv10->vtxbuf[i].buffer);
pipe_buffer_unmap(pscreen, nv10->vtxbuf[i].buffer);
draw_set_mapped_vertex_buffer(draw, i, NULL);
}
}
if (indexBuffer) {
pipe->winsys->buffer_unmap(pipe->winsys, indexBuffer);
pipe_buffer_unmap(pscreen, indexBuffer);
draw_set_mapped_element_buffer(draw, 0, NULL);
}
+5 -7
View File
@@ -152,12 +152,11 @@ static void *
nv20_vbuf_render_map_vertices( struct vbuf_render *render )
{
struct nv20_vbuf_render *nv20_render = nv20_vbuf_render(render);
struct pipe_winsys *winsys = nv20_render->nv20->pipe.winsys;
struct pipe_screen *pscreen = nv20_render->nv20->pipe.screen;
if (nv20_render->pbuffer) {
return winsys->buffer_map(winsys,
nv20_render->pbuffer,
PIPE_BUFFER_USAGE_CPU_WRITE);
return pipe_buffer_map(pscreen, nv20_render->pbuffer,
PIPE_BUFFER_USAGE_CPU_WRITE);
} else if (nv20_render->mbuffer) {
return nv20_render->mbuffer;
} else
@@ -173,10 +172,10 @@ nv20_vbuf_render_unmap_vertices( struct vbuf_render *render,
ushort max_index )
{
struct nv20_vbuf_render *nv20_render = nv20_vbuf_render(render);
struct pipe_winsys *winsys = nv20_render->nv20->pipe.winsys;
struct pipe_screen *pscreen = nv20_render->nv20->pipe.screen;
if (nv20_render->pbuffer)
winsys->buffer_unmap(winsys, nv20_render->pbuffer);
pipe_buffer_unmap(pscreen, nv20_render->pbuffer);
}
static boolean
@@ -358,7 +357,6 @@ nv20_vbuf_render_release_vertices( struct vbuf_render *render )
{
struct nv20_vbuf_render *nv20_render = nv20_vbuf_render(render);
struct nv20_context *nv20 = nv20_render->nv20;
struct pipe_screen *pscreen = &nv20->screen->base.base;
if (nv20_render->pbuffer) {
pipe_buffer_reference(&nv20_render->pbuffer, NULL);
+4 -3
View File
@@ -2,6 +2,7 @@
#include "pipe/p_state.h"
#include "pipe/p_defines.h"
#include "pipe/p_shader_tokens.h"
#include "pipe/p_inlines.h"
#include "tgsi/tgsi_parse.h"
@@ -453,7 +454,7 @@ nv20_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
const struct pipe_constant_buffer *buf )
{
struct nv20_context *nv20 = nv20_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
assert(shader < PIPE_SHADER_TYPES);
assert(index == 0);
@@ -461,12 +462,12 @@ nv20_set_constant_buffer(struct pipe_context *pipe, uint shader, uint index,
if (buf) {
void *mapped;
if (buf->buffer && buf->buffer->size &&
(mapped = ws->buffer_map(ws, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
(mapped = pipe_buffer_map(pscreen, buf->buffer, PIPE_BUFFER_USAGE_CPU_READ)))
{
memcpy(nv20->constbuf[shader], mapped, buf->buffer->size);
nv20->constbuf_nr[shader] =
buf->buffer->size / (4 * sizeof(float));
ws->buffer_unmap(ws, buf->buffer);
pipe_buffer_unmap(pscreen, buf->buffer);
}
}
}
+9 -7
View File
@@ -1,6 +1,7 @@
#include "draw/draw_context.h"
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv20_context.h"
#include "nv20_state.h"
@@ -13,6 +14,7 @@ boolean nv20_draw_elements( struct pipe_context *pipe,
unsigned indexSize,
unsigned prim, unsigned start, unsigned count)
{
struct pipe_screen *pscreen = pipe->screen;
struct nv20_context *nv20 = nv20_context( pipe );
struct draw_context *draw = nv20->draw;
unsigned i;
@@ -25,17 +27,17 @@ boolean nv20_draw_elements( struct pipe_context *pipe,
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv20->vtxbuf[i].buffer) {
void *buf
= pipe->winsys->buffer_map(pipe->winsys,
nv20->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
= pipe_buffer_map(pscreen,
nv20->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_vertex_buffer(draw, i, buf);
}
}
/* Map index buffer, if present */
if (indexBuffer) {
void *mapped_indexes
= pipe->winsys->buffer_map(pipe->winsys, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
= pipe_buffer_map(pscreen, indexBuffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer(draw, indexSize, mapped_indexes);
}
else {
@@ -55,12 +57,12 @@ boolean nv20_draw_elements( struct pipe_context *pipe,
*/
for (i = 0; i < PIPE_MAX_ATTRIBS; i++) {
if (nv20->vtxbuf[i].buffer) {
pipe->winsys->buffer_unmap(pipe->winsys, nv20->vtxbuf[i].buffer);
pipe_buffer_unmap(pscreen, nv20->vtxbuf[i].buffer);
draw_set_mapped_vertex_buffer(draw, i, NULL);
}
}
if (indexBuffer) {
pipe->winsys->buffer_unmap(pipe->winsys, indexBuffer);
pipe_buffer_unmap(pscreen, indexBuffer);
draw_set_mapped_element_buffer(draw, 0, NULL);
}
+6 -6
View File
@@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_parse.h"
@@ -645,8 +646,8 @@ out_err:
static boolean
nv20_vertprog_validate(struct nv20_context *nv20)
{
struct pipe_screen *pscreen = nv20->pipe.screen;
struct nouveau_winsys *nvws = nv20->nvws;
struct pipe_winsys *ws = nv20->pipe.winsys;
struct nouveau_grobj *rankine = nv20->screen->rankine;
struct nv20_vertex_program *vp;
struct pipe_buffer *constbuf;
@@ -749,8 +750,8 @@ nv20_vertprog_validate(struct nv20_context *nv20)
float *map = NULL;
if (constbuf) {
map = ws->buffer_map(ws, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
}
for (i = 0; i < vp->nr_consts; i++) {
@@ -770,9 +771,8 @@ nv20_vertprog_validate(struct nv20_context *nv20)
OUT_RINGp ((uint32_t *)vpd->value, 4);
}
if (constbuf) {
ws->buffer_unmap(ws, constbuf);
}
if (constbuf)
pipe_buffer_unmap(pscreen, constbuf);
}
/* Upload vtxprog */
+9 -8
View File
@@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_parse.h"
@@ -798,12 +799,12 @@ static void
nv30_fragprog_upload(struct nv30_context *nv30,
struct nv30_fragment_program *fp)
{
struct pipe_winsys *ws = nv30->pipe.winsys;
struct pipe_screen *pscreen = nv30->pipe.screen;
const uint32_t le = 1;
uint32_t *map;
int i;
map = ws->buffer_map(ws, fp->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
map = pipe_buffer_map(pscreen, fp->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
#if 0
for (i = 0; i < fp->insn_len; i++) {
@@ -825,7 +826,7 @@ nv30_fragprog_upload(struct nv30_context *nv30,
}
}
ws->buffer_unmap(ws, fp->buffer);
pipe_buffer_unmap(pscreen, fp->buffer);
}
static boolean
@@ -834,8 +835,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
struct nv30_fragment_program *fp = nv30->fragprog;
struct pipe_buffer *constbuf =
nv30->constbuf[PIPE_SHADER_FRAGMENT];
struct pipe_screen *screen = nv30->pipe.screen;
struct pipe_winsys *ws = nv30->pipe.winsys;
struct pipe_screen *pscreen = nv30->pipe.screen;
struct nouveau_stateobj *so;
boolean new_consts = FALSE;
int i;
@@ -850,7 +850,7 @@ nv30_fragprog_validate(struct nv30_context *nv30)
return FALSE;
}
fp->buffer = screen->buffer_create(screen, 0x100, 0, fp->insn_len * 4);
fp->buffer = pscreen->buffer_create(pscreen, 0x100, 0, fp->insn_len * 4);
nv30_fragprog_upload(nv30, fp);
so = so_new(8, 1);
@@ -872,7 +872,8 @@ update_constants:
if (fp->nr_consts) {
float *map;
map = ws->buffer_map(ws, constbuf, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
for (i = 0; i < fp->nr_consts; i++) {
struct nv30_fragment_program_data *fpd = &fp->consts[i];
uint32_t *p = &fp->insn[fpd->offset];
@@ -883,7 +884,7 @@ update_constants:
memcpy(p, cb, 4 * sizeof(float));
new_consts = TRUE;
}
ws->buffer_unmap(ws, constbuf);
pipe_buffer_unmap(pscreen, constbuf);
if (new_consts)
nv30_fragprog_upload(nv30, fp);
+9 -9
View File
@@ -1,5 +1,6 @@
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv30_context.h"
#include "nv30_state.h"
@@ -108,7 +109,7 @@ nv30_vbo_static_attrib(struct nv30_context *nv30, struct nouveau_stateobj *so,
int attrib, struct pipe_vertex_element *ve,
struct pipe_vertex_buffer *vb)
{
struct pipe_winsys *ws = nv30->pipe.winsys;
struct pipe_screen *pscreen = nv30->pipe.screen;
struct nouveau_grobj *rankine = nv30->screen->rankine;
unsigned type, ncomp;
void *map;
@@ -116,7 +117,7 @@ nv30_vbo_static_attrib(struct nv30_context *nv30, struct nouveau_stateobj *so,
if (nv30_vbo_format_to_hw(ve->src_format, &type, &ncomp))
return FALSE;
map = ws->buffer_map(ws, vb->buffer, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, vb->buffer, PIPE_BUFFER_USAGE_CPU_READ);
map += vb->buffer_offset + ve->src_offset;
switch (type) {
@@ -148,18 +149,17 @@ nv30_vbo_static_attrib(struct nv30_context *nv30, struct nouveau_stateobj *so,
so_data (so, fui(v[0]));
break;
default:
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return FALSE;
}
}
break;
default:
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return FALSE;
}
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return TRUE;
}
@@ -368,10 +368,10 @@ nv30_draw_elements_inline(struct pipe_context *pipe,
unsigned mode, unsigned start, unsigned count)
{
struct nv30_context *nv30 = nv30_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
void *map;
map = ws->buffer_map(ws, ib, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, ib, PIPE_BUFFER_USAGE_CPU_READ);
if (!ib) {
NOUVEAU_ERR("failed mapping ib\n");
return FALSE;
@@ -392,7 +392,7 @@ nv30_draw_elements_inline(struct pipe_context *pipe,
break;
}
ws->buffer_unmap(ws, ib);
pipe_buffer_unmap(pscreen, ib);
return TRUE;
}
+6 -6
View File
@@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_parse.h"
@@ -645,7 +646,7 @@ out_err:
static boolean
nv30_vertprog_validate(struct nv30_context *nv30)
{
struct pipe_winsys *ws = nv30->pipe.winsys;
struct pipe_screen *pscreen = nv30->pipe.screen;
struct nouveau_grobj *rankine = nv30->screen->rankine;
struct nv30_vertex_program *vp;
struct pipe_buffer *constbuf;
@@ -750,8 +751,8 @@ nv30_vertprog_validate(struct nv30_context *nv30)
float *map = NULL;
if (constbuf) {
map = ws->buffer_map(ws, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
}
for (i = 0; i < vp->nr_consts; i++) {
@@ -771,9 +772,8 @@ nv30_vertprog_validate(struct nv30_context *nv30)
OUT_RINGp ((uint32_t *)vpd->value, 4);
}
if (constbuf) {
ws->buffer_unmap(ws, constbuf);
}
if (constbuf)
pipe_buffer_unmap(pscreen, constbuf);
}
/* Upload vtxprog */
+11 -8
View File
@@ -1,4 +1,5 @@
#include "pipe/p_shader_tokens.h"
#include "pipe/p_inlines.h"
#include "util/u_pack_color.h"
@@ -231,7 +232,7 @@ nv40_draw_elements_swtnl(struct pipe_context *pipe,
unsigned mode, unsigned start, unsigned count)
{
struct nv40_context *nv40 = nv40_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
unsigned i;
void *map;
@@ -241,13 +242,14 @@ nv40_draw_elements_swtnl(struct pipe_context *pipe,
nv40_state_emit(nv40);
for (i = 0; i < nv40->vtxbuf_nr; i++) {
map = ws->buffer_map(ws, nv40->vtxbuf[i].buffer,
map = pipe_buffer_map(pscreen, nv40->vtxbuf[i].buffer,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_vertex_buffer(nv40->draw, i, map);
}
if (idxbuf) {
map = ws->buffer_map(ws, idxbuf, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, idxbuf,
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_element_buffer(nv40->draw, idxbuf_size, map);
} else {
draw_set_mapped_element_buffer(nv40->draw, 0, NULL);
@@ -256,21 +258,22 @@ nv40_draw_elements_swtnl(struct pipe_context *pipe,
if (nv40->constbuf[PIPE_SHADER_VERTEX]) {
const unsigned nr = nv40->constbuf_nr[PIPE_SHADER_VERTEX];
map = ws->buffer_map(ws, nv40->constbuf[PIPE_SHADER_VERTEX],
PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen,
nv40->constbuf[PIPE_SHADER_VERTEX],
PIPE_BUFFER_USAGE_CPU_READ);
draw_set_mapped_constant_buffer(nv40->draw, map, nr);
}
draw_arrays(nv40->draw, mode, start, count);
for (i = 0; i < nv40->vtxbuf_nr; i++)
ws->buffer_unmap(ws, nv40->vtxbuf[i].buffer);
pipe_buffer_unmap(pscreen, nv40->vtxbuf[i].buffer);
if (idxbuf)
ws->buffer_unmap(ws, idxbuf);
pipe_buffer_unmap(pscreen, idxbuf);
if (nv40->constbuf[PIPE_SHADER_VERTEX])
ws->buffer_unmap(ws, nv40->constbuf[PIPE_SHADER_VERTEX]);
pipe_buffer_unmap(pscreen, nv40->constbuf[PIPE_SHADER_VERTEX]);
draw_flush(nv40->draw);
pipe->flush(pipe, 0, NULL);
+9 -8
View File
@@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_parse.h"
@@ -881,12 +882,12 @@ static void
nv40_fragprog_upload(struct nv40_context *nv40,
struct nv40_fragment_program *fp)
{
struct pipe_winsys *ws = nv40->pipe.winsys;
struct pipe_screen *pscreen = nv40->pipe.screen;
const uint32_t le = 1;
uint32_t *map;
int i;
map = ws->buffer_map(ws, fp->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
map = pipe_buffer_map(pscreen, fp->buffer, PIPE_BUFFER_USAGE_CPU_WRITE);
#if 0
for (i = 0; i < fp->insn_len; i++) {
@@ -908,7 +909,7 @@ nv40_fragprog_upload(struct nv40_context *nv40,
}
}
ws->buffer_unmap(ws, fp->buffer);
pipe_buffer_unmap(pscreen, fp->buffer);
}
static boolean
@@ -917,8 +918,7 @@ nv40_fragprog_validate(struct nv40_context *nv40)
struct nv40_fragment_program *fp = nv40->fragprog;
struct pipe_buffer *constbuf =
nv40->constbuf[PIPE_SHADER_FRAGMENT];
struct pipe_screen *screen = nv40->pipe.screen;
struct pipe_winsys *ws = nv40->pipe.winsys;
struct pipe_screen *pscreen = nv40->pipe.screen;
struct nouveau_stateobj *so;
boolean new_consts = FALSE;
int i;
@@ -933,7 +933,7 @@ nv40_fragprog_validate(struct nv40_context *nv40)
return FALSE;
}
fp->buffer = screen->buffer_create(screen, 0x100, 0, fp->insn_len * 4);
fp->buffer = pscreen->buffer_create(pscreen, 0x100, 0, fp->insn_len * 4);
nv40_fragprog_upload(nv40, fp);
so = so_new(4, 1);
@@ -951,7 +951,8 @@ update_constants:
if (fp->nr_consts) {
float *map;
map = ws->buffer_map(ws, constbuf, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
for (i = 0; i < fp->nr_consts; i++) {
struct nv40_fragment_program_data *fpd = &fp->consts[i];
uint32_t *p = &fp->insn[fpd->offset];
@@ -962,7 +963,7 @@ update_constants:
memcpy(p, cb, 4 * sizeof(float));
new_consts = TRUE;
}
ws->buffer_unmap(ws, constbuf);
pipe_buffer_unmap(pscreen, constbuf);
if (new_consts)
nv40_fragprog_upload(nv40, fp);
+9 -8
View File
@@ -1,5 +1,6 @@
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv40_context.h"
#include "nv40_state.h"
@@ -108,7 +109,7 @@ nv40_vbo_static_attrib(struct nv40_context *nv40, struct nouveau_stateobj *so,
int attrib, struct pipe_vertex_element *ve,
struct pipe_vertex_buffer *vb)
{
struct pipe_winsys *ws = nv40->pipe.winsys;
struct pipe_screen *pscreen = nv40->pipe.screen;
struct nouveau_grobj *curie = nv40->screen->curie;
unsigned type, ncomp;
void *map;
@@ -116,7 +117,7 @@ nv40_vbo_static_attrib(struct nv40_context *nv40, struct nouveau_stateobj *so,
if (nv40_vbo_format_to_hw(ve->src_format, &type, &ncomp))
return FALSE;
map = ws->buffer_map(ws, vb->buffer, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, vb->buffer, PIPE_BUFFER_USAGE_CPU_READ);
map += vb->buffer_offset + ve->src_offset;
switch (type) {
@@ -148,17 +149,17 @@ nv40_vbo_static_attrib(struct nv40_context *nv40, struct nouveau_stateobj *so,
so_data (so, fui(v[0]));
break;
default:
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return FALSE;
}
}
break;
default:
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return FALSE;
}
ws->buffer_unmap(ws, vb->buffer);
pipe_buffer_unmap(pscreen, vb->buffer);
return TRUE;
}
@@ -367,10 +368,10 @@ nv40_draw_elements_inline(struct pipe_context *pipe,
unsigned mode, unsigned start, unsigned count)
{
struct nv40_context *nv40 = nv40_context(pipe);
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
void *map;
map = ws->buffer_map(ws, ib, PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, ib, PIPE_BUFFER_USAGE_CPU_READ);
if (!ib) {
NOUVEAU_ERR("failed mapping ib\n");
return FALSE;
@@ -391,7 +392,7 @@ nv40_draw_elements_inline(struct pipe_context *pipe,
break;
}
ws->buffer_unmap(ws, ib);
pipe_buffer_unmap(pscreen, ib);
return TRUE;
}
+5 -4
View File
@@ -1,6 +1,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "pipe/p_shader_tokens.h"
#include "tgsi/tgsi_parse.h"
@@ -855,7 +856,7 @@ out_err:
static boolean
nv40_vertprog_validate(struct nv40_context *nv40)
{
struct pipe_winsys *ws = nv40->pipe.winsys;
struct pipe_screen *pscreen = nv40->pipe.screen;
struct nouveau_grobj *curie = nv40->screen->curie;
struct nv40_vertex_program *vp;
struct pipe_buffer *constbuf;
@@ -980,8 +981,8 @@ check_gpu_resources:
float *map = NULL;
if (constbuf) {
map = ws->buffer_map(ws, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
map = pipe_buffer_map(pscreen, constbuf,
PIPE_BUFFER_USAGE_CPU_READ);
}
for (i = 0; i < vp->nr_consts; i++) {
@@ -1002,7 +1003,7 @@ check_gpu_resources:
}
if (constbuf)
ws->buffer_unmap(ws, constbuf);
pscreen->buffer_unmap(pscreen, constbuf);
}
/* Upload vtxprog */
+4 -4
View File
@@ -2235,7 +2235,7 @@ nv50_program_upload_data(struct nv50_context *nv50, float *map,
static void
nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
{
struct pipe_winsys *ws = nv50->pipe.winsys;
struct pipe_screen *pscreen = nv50->pipe.screen;
if (!p->data[0] && p->immd_nr) {
struct nouveau_resource *heap = nv50->screen->immd_heap[0];
@@ -2274,13 +2274,13 @@ nv50_program_validate_data(struct nv50_context *nv50, struct nv50_program *p)
if (p->param_nr) {
unsigned cbuf = NV50_CB_PVP;
float *map = ws->buffer_map(ws, nv50->constbuf[p->type],
PIPE_BUFFER_USAGE_CPU_READ);
float *map = pipe_buffer_map(pscreen, nv50->constbuf[p->type],
PIPE_BUFFER_USAGE_CPU_READ);
if (p->type == PIPE_SHADER_FRAGMENT)
cbuf = NV50_CB_PFP;
nv50_program_upload_data(nv50, map, p->data[1]->start,
p->param_nr, cbuf);
ws->buffer_unmap(ws, nv50->constbuf[p->type]);
pipe_buffer_unmap(pscreen, nv50->constbuf[p->type]);
}
}
+4 -4
View File
@@ -105,7 +105,7 @@ static boolean
nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
boolean wait, uint64_t *result)
{
struct pipe_winsys *ws = pipe->winsys;
struct pipe_screen *pscreen = pipe->screen;
struct nv50_query *q = nv50_query(pq);
/*XXX: Want to be able to return FALSE here instead of blocking
@@ -113,11 +113,11 @@ nv50_query_result(struct pipe_context *pipe, struct pipe_query *pq,
*/
if (!q->ready) {
uint32_t *map = ws->buffer_map(ws, q->buffer,
PIPE_BUFFER_USAGE_CPU_READ);
uint32_t *map = pipe_buffer_map(pscreen, q->buffer,
PIPE_BUFFER_USAGE_CPU_READ);
q->result = map[1];
q->ready = TRUE;
ws->buffer_unmap(ws, q->buffer);
pipe_buffer_unmap(pscreen, q->buffer);
}
*result = q->result;
+6 -2
View File
@@ -22,6 +22,7 @@
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "pipe/p_inlines.h"
#include "nv50_context.h"
@@ -165,8 +166,10 @@ nv50_draw_elements(struct pipe_context *pipe,
struct nv50_context *nv50 = nv50_context(pipe);
struct nouveau_channel *chan = nv50->screen->tesla->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);
struct pipe_screen *pscreen = pipe->screen;
void *map;
map = pipe_buffer_map(pscreen, indexBuffer, PIPE_BUFFER_USAGE_CPU_READ);
nv50_state_validate(nv50);
@@ -193,6 +196,7 @@ nv50_draw_elements(struct pipe_context *pipe,
BEGIN_RING(chan, tesla, NV50TCL_VERTEX_END, 1);
OUT_RING (chan, 0);
pipe_buffer_unmap(pscreen, indexBuffer);
pipe->flush(pipe, 0, NULL);
return TRUE;
}
+1 -2
View File
@@ -3,8 +3,7 @@ include $(TOP)/configs/current
LIBNAME = nouveaudrm
C_SOURCES = nouveau_drm_api.c \
nouveau_winsys_pipe.c
C_SOURCES = nouveau_drm_api.c
LIBRARY_INCLUDES = $(shell pkg-config libdrm libdrm_nouveau --cflags-only-I)
LIBRARY_DEFINES = $(shell pkg-config libdrm libdrm_nouveau --cflags-only-other)
@@ -1,12 +1,16 @@
#include "pipe/p_context.h"
#include "pipe/p_state.h"
#include "util/u_memory.h"
#include "nouveau_drm_api.h"
#include "nouveau_winsys_pipe.h"
#include "nouveau_drmif.h"
#include "nouveau_channel.h"
#include "nouveau_bo.h"
#include "nouveau/nouveau_winsys.h"
#include "nouveau/nouveau_screen.h"
static struct pipe_surface *
dri_surface_from_handle(struct pipe_screen *screen,
unsigned handle,
@@ -58,7 +62,7 @@ dri_surface_from_handle(struct pipe_screen *screen,
static struct pipe_surface *
nouveau_dri1_front_surface(struct pipe_context *pipe)
{
return nouveau_screen(pipe->screen)->front;
return nouveau_winsys_screen(pipe->screen)->front;
}
static struct dri1_api nouveau_dri1_api = {
@@ -69,6 +73,7 @@ static struct pipe_screen *
nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg)
{
struct dri1_create_screen_arg *dri1 = (void *)arg;
struct nouveau_winsys *nvws;
struct pipe_winsys *ws;
struct nouveau_device *dev = NULL;
struct pipe_screen *(*init)(struct pipe_winsys *,
@@ -107,20 +112,20 @@ nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg)
return NULL;
}
ws = nouveau_pipe_winsys_new(dev);
if (!ws) {
nvws = CALLOC_STRUCT(nouveau_winsys);
if (!nvws) {
nouveau_device_close(&dev);
return NULL;
}
ws = &nvws->base;
nouveau_pipe_winsys(ws)->pscreen = init(ws, dev);
if (!nouveau_pipe_winsys(ws)->pscreen) {
nvws->pscreen = init(ws, dev);
if (!nvws->pscreen) {
ws->destroy(ws);
return NULL;
}
if (arg->mode == DRM_CREATE_DRI1) {
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws);
struct nouveau_dri *nvdri = dri1->ddx_info;
enum pipe_format format;
@@ -129,14 +134,14 @@ nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg)
else
format = PIPE_FORMAT_A8R8G8B8_UNORM;
nvpws->front = dri_surface_from_handle(nvpws->pscreen,
nvws->front = dri_surface_from_handle(nvws->pscreen,
nvdri->front_offset,
format,
nvdri->width,
nvdri->height,
nvdri->front_pitch *
(nvdri->bpp / 8));
if (!nvpws->front) {
if (!nvws->front) {
debug_printf("%s: error referencing front buffer\n",
__func__);
ws->destroy(ws);
@@ -146,15 +151,15 @@ nouveau_drm_create_screen(int fd, struct drm_create_screen_arg *arg)
dri1->api = &nouveau_dri1_api;
}
return nouveau_pipe_winsys(ws)->pscreen;
return nvws->pscreen;
}
static struct pipe_context *
nouveau_drm_create_context(struct pipe_screen *pscreen)
{
struct nouveau_pipe_winsys *nvpws = nouveau_screen(pscreen);
struct nouveau_winsys *nvws = nouveau_winsys_screen(pscreen);
struct pipe_context *(*init)(struct pipe_screen *, unsigned);
unsigned chipset = nvpws->channel->device->chipset;
unsigned chipset = nouveau_screen(pscreen)->device->chipset;
int i;
switch (chipset & 0xf0) {
@@ -185,19 +190,19 @@ nouveau_drm_create_context(struct pipe_screen *pscreen)
}
/* Find a free slot for a pipe context, allocate a new one if needed */
for (i = 0; i < nvpws->nr_pctx; i++) {
if (nvpws->pctx[i] == NULL)
for (i = 0; i < nvws->nr_pctx; i++) {
if (nvws->pctx[i] == NULL)
break;
}
if (i == nvpws->nr_pctx) {
nvpws->nr_pctx++;
nvpws->pctx = realloc(nvpws->pctx,
sizeof(*nvpws->pctx) * nvpws->nr_pctx);
if (i == nvws->nr_pctx) {
nvws->nr_pctx++;
nvws->pctx = realloc(nvws->pctx,
sizeof(*nvws->pctx) * nvws->nr_pctx);
}
nvpws->pctx[i] = init(pscreen, i);
return nvpws->pctx[i];
nvws->pctx[i] = init(pscreen, i);
return nvws->pctx[i];
}
static boolean
@@ -211,42 +216,41 @@ static struct pipe_buffer *
nouveau_drm_pb_from_handle(struct pipe_screen *pscreen, const char *name,
unsigned handle)
{
struct nouveau_pipe_winsys *nvpws = nouveau_screen(pscreen);
struct nouveau_device *dev = nvpws->channel->device;
struct nouveau_pipe_buffer *nvpb;
struct nouveau_device *dev = nouveau_screen(pscreen)->device;
struct pipe_buffer *pb;
int ret;
nvpb = CALLOC_STRUCT(nouveau_pipe_buffer);
if (!nvpb)
pb = CALLOC(1, sizeof(struct pipe_buffer) + sizeof(struct nouveau_bo*));
if (!pb)
return NULL;
ret = nouveau_bo_handle_ref(dev, handle, &nvpb->bo);
ret = nouveau_bo_handle_ref(dev, handle, (struct nouveau_bo**)(pb+1));
if (ret) {
debug_printf("%s: ref name 0x%08x failed with %d\n",
__func__, handle, ret);
FREE(nvpb);
FREE(pb);
return NULL;
}
pipe_reference_init(&nvpb->base.reference, 1);
nvpb->base.screen = pscreen;
nvpb->base.alignment = 0;
nvpb->base.usage = PIPE_BUFFER_USAGE_GPU_READ_WRITE |
PIPE_BUFFER_USAGE_CPU_READ_WRITE;
nvpb->base.size = nvpb->bo->size;
return &nvpb->base;
pipe_reference_init(&pb->reference, 1);
pb->screen = pscreen;
pb->alignment = 0;
pb->usage = PIPE_BUFFER_USAGE_GPU_READ_WRITE |
PIPE_BUFFER_USAGE_CPU_READ_WRITE;
pb->size = nouveau_bo(pb)->size;
return pb;
}
static boolean
nouveau_drm_handle_from_pb(struct pipe_screen *pscreen, struct pipe_buffer *pb,
unsigned *handle)
{
struct nouveau_pipe_buffer *nvpb = nouveau_pipe_buffer(pb);
struct nouveau_bo *bo = nouveau_bo(pb);
if (!nvpb)
if (!bo)
return FALSE;
*handle = nvpb->bo->handle;
*handle = bo->handle;
return TRUE;
}
@@ -254,12 +258,12 @@ static boolean
nouveau_drm_name_from_pb(struct pipe_screen *pscreen, struct pipe_buffer *pb,
unsigned *handle)
{
struct nouveau_pipe_buffer *nvpb = nouveau_pipe_buffer(pb);
struct nouveau_bo *bo = nouveau_bo(pb);
if (!nvpb)
if (!bo)
return FALSE;
return nouveau_bo_handle_get(nvpb->bo, handle) == 0;
return nouveau_bo_handle_get(bo, handle) == 0;
}
struct drm_api drm_api_hooks = {
@@ -1,7 +1,34 @@
#ifndef __NOUVEAU_DRM_API_H__
#define __NOUVEAU_DRM_API_H__
#include "state_tracker/drm_api.h"
#include "state_tracker/dri1_api.h"
#include "pipe/internal/p_winsys_screen.h"
#include "nouveau_dri.h"
struct nouveau_winsys {
struct pipe_winsys base;
struct pipe_screen *pscreen;
unsigned nr_pctx;
struct pipe_context **pctx;
struct pipe_surface *front;
};
static INLINE struct nouveau_winsys *
nouveau_winsys(struct pipe_winsys *ws)
{
return (struct nouveau_winsys *)ws;
}
static INLINE struct nouveau_winsys *
nouveau_winsys_screen(struct pipe_screen *pscreen)
{
return nouveau_winsys(pscreen->winsys);
}
#endif
@@ -1,205 +0,0 @@
#include "pipe/internal/p_winsys_screen.h"
#include <pipe/p_defines.h>
#include <pipe/p_inlines.h>
#include <util/u_memory.h>
#include "nouveau_winsys_pipe.h"
#include "nouveau_drmif.h"
#include "nouveau_bo.h"
static const char *
nouveau_get_name(struct pipe_winsys *pws)
{
return "Nouveau/DRI";
}
static uint32_t
nouveau_flags_from_usage(struct pipe_winsys *ws, unsigned usage)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws);
struct pipe_screen *pscreen = nvpws->pscreen;
uint32_t flags = NOUVEAU_BO_LOCAL;
if (usage & NOUVEAU_BUFFER_USAGE_TRANSFER)
flags |= NOUVEAU_BO_GART;
if (usage & PIPE_BUFFER_USAGE_PIXEL) {
if (usage & NOUVEAU_BUFFER_USAGE_TEXTURE)
flags |= NOUVEAU_BO_GART;
if (!(usage & PIPE_BUFFER_USAGE_CPU_READ_WRITE))
flags |= NOUVEAU_BO_VRAM;
switch (nvpws->channel->device->chipset & 0xf0) {
case 0x50:
case 0x80:
case 0x90:
flags |= NOUVEAU_BO_TILED;
if (usage & NOUVEAU_BUFFER_USAGE_ZETA)
flags |= NOUVEAU_BO_ZTILE;
break;
default:
break;
}
}
if (usage & PIPE_BUFFER_USAGE_VERTEX) {
if (pscreen->get_param(pscreen, NOUVEAU_CAP_HW_VTXBUF))
flags |= NOUVEAU_BO_GART;
}
if (usage & PIPE_BUFFER_USAGE_INDEX) {
if (pscreen->get_param(pscreen, NOUVEAU_CAP_HW_IDXBUF))
flags |= NOUVEAU_BO_GART;
}
return flags;
}
static struct pipe_buffer *
nouveau_pipe_bo_create(struct pipe_winsys *ws, unsigned alignment,
unsigned usage, unsigned size)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws);
struct nouveau_device *dev = nvpws->channel->device;
struct nouveau_pipe_buffer *nvbuf;
uint32_t flags;
nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer);
if (!nvbuf)
return NULL;
pipe_reference_init(&nvbuf->base.reference, 1);
nvbuf->base.alignment = alignment;
nvbuf->base.usage = usage;
nvbuf->base.size = size;
flags = nouveau_flags_from_usage(ws, usage);
flags |= NOUVEAU_BO_MAP;
if (nouveau_bo_new(dev, flags, alignment, size, &nvbuf->bo)) {
FREE(nvbuf);
return NULL;
}
return &nvbuf->base;
}
static struct pipe_buffer *
nouveau_pipe_bo_user_create(struct pipe_winsys *ws, void *ptr, unsigned bytes)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws);
struct nouveau_device *dev = nvpws->channel->device;
struct nouveau_pipe_buffer *nvbuf;
nvbuf = CALLOC_STRUCT(nouveau_pipe_buffer);
if (!nvbuf)
return NULL;
pipe_reference_init(&nvbuf->base.reference, 1);
nvbuf->base.size = bytes;
if (nouveau_bo_user(dev, ptr, bytes, &nvbuf->bo)) {
FREE(nvbuf);
return NULL;
}
return &nvbuf->base;
}
static void
nouveau_pipe_bo_del(struct pipe_buffer *buf)
{
struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf);
nouveau_bo_ref(NULL, &nvbuf->bo);
FREE(nvbuf);
}
static void *
nouveau_pipe_bo_map(struct pipe_winsys *pws, struct pipe_buffer *buf,
unsigned flags)
{
struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf);
uint32_t map_flags = 0;
if (flags & PIPE_BUFFER_USAGE_CPU_READ)
map_flags |= NOUVEAU_BO_RD;
if (flags & PIPE_BUFFER_USAGE_CPU_WRITE)
map_flags |= NOUVEAU_BO_WR;
if (nouveau_bo_map(nvbuf->bo, map_flags))
return NULL;
return nvbuf->bo->map;
}
static void
nouveau_pipe_bo_unmap(struct pipe_winsys *pws, struct pipe_buffer *buf)
{
struct nouveau_pipe_buffer *nvbuf = nouveau_pipe_buffer(buf);
nouveau_bo_unmap(nvbuf->bo);
}
static void
nouveau_pipe_fence_reference(struct pipe_winsys *ws,
struct pipe_fence_handle **ptr,
struct pipe_fence_handle *pfence)
{
*ptr = pfence;
}
static int
nouveau_pipe_fence_signalled(struct pipe_winsys *ws,
struct pipe_fence_handle *pfence, unsigned flag)
{
return 0;
}
static int
nouveau_pipe_fence_finish(struct pipe_winsys *ws,
struct pipe_fence_handle *pfence, unsigned flag)
{
return 0;
}
static void
nouveau_destroy(struct pipe_winsys *ws)
{
struct nouveau_pipe_winsys *nvpws = nouveau_pipe_winsys(ws);
nouveau_device_close(&nvpws->channel->device);
FREE(nvpws);
}
struct pipe_winsys *
nouveau_pipe_winsys_new(struct nouveau_device *dev)
{
struct nouveau_pipe_winsys *nvpws;
int ret;
nvpws = CALLOC_STRUCT(nouveau_pipe_winsys);
if (!nvpws)
return NULL;
ret = nouveau_channel_alloc(dev, 0xbeef0201, 0xbeef0202,
&nvpws->channel);
if (ret) {
debug_printf("%s: error opening GPU channel: %d\n",
__func__, ret);
FREE(nvpws);
return NULL;
}
nvpws->next_handle = 0x77000000;
nvpws->base.buffer_create = nouveau_pipe_bo_create;
nvpws->base.buffer_destroy = nouveau_pipe_bo_del;
nvpws->base.user_buffer_create = nouveau_pipe_bo_user_create;
nvpws->base.buffer_map = nouveau_pipe_bo_map;
nvpws->base.buffer_unmap = nouveau_pipe_bo_unmap;
nvpws->base.fence_reference = nouveau_pipe_fence_reference;
nvpws->base.fence_signalled = nouveau_pipe_fence_signalled;
nvpws->base.fence_finish = nouveau_pipe_fence_finish;
nvpws->base.get_name = nouveau_get_name;
nvpws->base.destroy = nouveau_destroy;
return &nvpws->base;
}
@@ -1,54 +0,0 @@
#ifndef NOUVEAU_PIPE_WINSYS_H
#define NOUVEAU_PIPE_WINSYS_H
#include "pipe/internal/p_winsys_screen.h"
#include "pipe/p_context.h"
#include "nouveau/nouveau_winsys.h"
#include "nouveau_device.h"
struct nouveau_pipe_buffer {
struct pipe_buffer base;
struct nouveau_bo *bo;
};
static INLINE struct nouveau_pipe_buffer *
nouveau_pipe_buffer(struct pipe_buffer *buf)
{
return (struct nouveau_pipe_buffer *)buf;
}
struct nouveau_pipe_winsys {
struct pipe_winsys base;
struct pipe_screen *pscreen;
struct nouveau_channel *channel;
uint32_t next_handle;
unsigned nr_pctx;
struct pipe_context **pctx;
struct pipe_surface *front;
};
static INLINE struct nouveau_pipe_winsys *
nouveau_pipe_winsys(struct pipe_winsys *ws)
{
return (struct nouveau_pipe_winsys *)ws;
}
static INLINE struct nouveau_pipe_winsys *
nouveau_screen(struct pipe_screen *pscreen)
{
return nouveau_pipe_winsys(pscreen->winsys);
}
struct pipe_winsys *
nouveau_pipe_winsys_new(struct nouveau_device *);
struct nouveau_winsys *
nouveau_winsys_new(struct pipe_winsys *ws);
#endif