mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-07 14:48:17 +02:00
r200/r300: swtcl fixups to use old dma buffers on top of BOs
This commit is contained in:
parent
e45213d89b
commit
f68a61d883
14 changed files with 166 additions and 314 deletions
|
|
@ -297,6 +297,7 @@ static void r200_init_vtbl(radeonContextPtr radeon)
|
|||
radeon->vtbl.update_draw_buffer = r200UpdateDrawBuffer;
|
||||
radeon->vtbl.emit_cs_header = r200_vtbl_emit_cs_header;
|
||||
radeon->vtbl.emit_state = r200_vtbl_emit_state;
|
||||
radeon->vtbl.swtcl_flush = r200_swtcl_flush;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -389,7 +390,7 @@ GLboolean r200CreateContext( const __GLcontextModes *glVisual,
|
|||
rmesa->radeon.texture_depth = ( screen->cpp == 4 ) ?
|
||||
DRI_CONF_TEXTURE_DEPTH_32 : DRI_CONF_TEXTURE_DEPTH_16;
|
||||
|
||||
rmesa->swtcl.RenderIndex = ~0;
|
||||
rmesa->radeon.swtcl.RenderIndex = ~0;
|
||||
rmesa->hw.all_dirty = 1;
|
||||
|
||||
/* Set the maximum texture size small enough that we can guarentee that
|
||||
|
|
|
|||
|
|
@ -551,40 +551,12 @@ struct r200_tcl_info {
|
|||
/* r200_swtcl.c
|
||||
*/
|
||||
struct r200_swtcl_info {
|
||||
GLuint RenderIndex;
|
||||
|
||||
/**
|
||||
* Size of a hardware vertex. This is calculated when \c ::vertex_attrs is
|
||||
* installed in the Mesa state vector.
|
||||
*/
|
||||
GLuint vertex_size;
|
||||
|
||||
/**
|
||||
* Attributes instructing the Mesa TCL pipeline where / how to put vertex
|
||||
* data in the hardware buffer.
|
||||
*/
|
||||
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
|
||||
|
||||
/**
|
||||
* Number of elements of \c ::vertex_attrs that are actually used.
|
||||
*/
|
||||
GLuint vertex_attr_count;
|
||||
|
||||
/**
|
||||
* Cached pointer to the buffer where Mesa will store vertex data.
|
||||
*/
|
||||
GLubyte *verts;
|
||||
|
||||
/* Fallback rasterization functions
|
||||
*/
|
||||
radeon_point_func draw_point;
|
||||
radeon_line_func draw_line;
|
||||
radeon_tri_func draw_tri;
|
||||
|
||||
GLuint hw_primitive;
|
||||
GLenum render_primitive;
|
||||
GLuint numverts;
|
||||
|
||||
/**
|
||||
* Offset of the 4UB color data within a hardware (swtcl) vertex.
|
||||
*/
|
||||
|
|
@ -599,8 +571,6 @@ struct r200_swtcl_info {
|
|||
* Should Mesa project vertex data or will the hardware do it?
|
||||
*/
|
||||
GLboolean needproj;
|
||||
|
||||
struct radeon_bo *bo;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -75,37 +75,29 @@ static void r200_emit_vecfog(GLcontext *ctx, struct radeon_aos *aos,
|
|||
{
|
||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||
uint32_t *out;
|
||||
uint32_t bo_size;
|
||||
int i;
|
||||
int size = 1;
|
||||
|
||||
memset(aos, 0, sizeof(struct radeon_aos));
|
||||
if (stride == 0) {
|
||||
bo_size = size * 4;
|
||||
radeonAllocDmaRegion(rmesa, &aos->bo, &aos->offset, size * 4, 32);
|
||||
count = 1;
|
||||
aos->stride = 0;
|
||||
} else {
|
||||
bo_size = size * count * 4;
|
||||
radeonAllocDmaRegion(rmesa, &aos->bo, &aos->offset, size * 4, 32);
|
||||
aos->stride = size;
|
||||
}
|
||||
aos->bo = radeon_bo_open(rmesa->radeonScreen->bom,
|
||||
0, bo_size, 32, RADEON_GEM_DOMAIN_GTT, 0);
|
||||
aos->offset = 0;
|
||||
|
||||
aos->components = size;
|
||||
aos->count = count;
|
||||
|
||||
radeon_bo_map(aos->bo, 1);
|
||||
out = (uint32_t*)((char*)aos->bo->ptr + aos->offset);
|
||||
for (i = 0; i < count; i++) {
|
||||
out[0] = r200ComputeFogBlendFactor( ctx, *(GLfloat *)data );
|
||||
out++;
|
||||
data += stride;
|
||||
}
|
||||
radeon_bo_unmap(aos->bo);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Emit any changed arrays to new GART memory, re-emit a packet to
|
||||
* update the arrays.
|
||||
*/
|
||||
|
|
@ -230,6 +222,7 @@ after_emit:
|
|||
rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = vfmt1;
|
||||
}
|
||||
|
||||
radeon_bo_unmap(rmesa->radeon.dma.current);
|
||||
rmesa->tcl.nr_aos_components = nr;
|
||||
}
|
||||
|
||||
|
|
@ -240,7 +233,9 @@ void r200ReleaseArrays( GLcontext *ctx, GLuint newinputs )
|
|||
int i;
|
||||
for (i = 0; i < rmesa->tcl.nr_aos_components; i++) {
|
||||
if (rmesa->tcl.aos[i].bo) {
|
||||
rmesa->tcl.aos[i].bo = radeon_bo_unref(rmesa->tcl.aos[i].bo);
|
||||
radeon_bo_unref(rmesa->tcl.aos[i].bo);
|
||||
rmesa->tcl.aos[i].bo = NULL;
|
||||
}
|
||||
}
|
||||
radeonReleaseDmaRegion(&rmesa->radeon);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,27 +56,24 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "r200_tcl.h"
|
||||
|
||||
|
||||
static void flush_last_swtcl_prim( GLcontext *ctx );
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* Initialization
|
||||
***********************************************************************/
|
||||
|
||||
#define EMIT_ATTR( ATTR, STYLE, F0 ) \
|
||||
do { \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = (ATTR); \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = (STYLE); \
|
||||
rmesa->swtcl.vertex_attr_count++; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR); \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE); \
|
||||
rmesa->radeon.swtcl.vertex_attr_count++; \
|
||||
fmt_0 |= F0; \
|
||||
} while (0)
|
||||
|
||||
#define EMIT_PAD( N ) \
|
||||
do { \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = 0; \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = EMIT_PAD; \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].offset = (N); \
|
||||
rmesa->swtcl.vertex_attr_count++; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N); \
|
||||
rmesa->radeon.swtcl.vertex_attr_count++; \
|
||||
} while (0)
|
||||
|
||||
static void r200SetVertexFormat( GLcontext *ctx )
|
||||
|
|
@ -101,7 +98,7 @@ static void r200SetVertexFormat( GLcontext *ctx )
|
|||
}
|
||||
|
||||
assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
|
||||
rmesa->swtcl.vertex_attr_count = 0;
|
||||
rmesa->radeon.swtcl.vertex_attr_count = 0;
|
||||
|
||||
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to
|
||||
* build up a hardware vertex.
|
||||
|
|
@ -194,12 +191,12 @@ static void r200SetVertexFormat( GLcontext *ctx )
|
|||
rmesa->hw.vtx.cmd[VTX_VTXFMT_0] = fmt_0;
|
||||
rmesa->hw.vtx.cmd[VTX_VTXFMT_1] = fmt_1;
|
||||
|
||||
rmesa->swtcl.vertex_size =
|
||||
rmesa->radeon.swtcl.vertex_size =
|
||||
_tnl_install_attrs( ctx,
|
||||
rmesa->swtcl.vertex_attrs,
|
||||
rmesa->swtcl.vertex_attr_count,
|
||||
rmesa->radeon.swtcl.vertex_attrs,
|
||||
rmesa->radeon.swtcl.vertex_attr_count,
|
||||
NULL, 0 );
|
||||
rmesa->swtcl.vertex_size /= 4;
|
||||
rmesa->radeon.swtcl.vertex_size /= 4;
|
||||
RENDERINPUTS_COPY( rmesa->radeon.tnl_index_bitset, index_bitset );
|
||||
}
|
||||
}
|
||||
|
|
@ -270,63 +267,27 @@ void r200ChooseVertexState( GLcontext *ctx )
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* Flush vertices in the current dma region.
|
||||
*/
|
||||
static void flush_last_swtcl_prim(GLcontext *ctx)
|
||||
void r200_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
|
||||
{
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx);
|
||||
if (R200_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
|
||||
rmesa->radeon.dma.flush = NULL;
|
||||
|
||||
radeon_bo_unmap(rmesa->swtcl.bo);
|
||||
rcommonEnsureCmdBufSpace(rmesa,
|
||||
rcommonEnsureCmdBufSpace(&rmesa->radeon,
|
||||
rmesa->hw.max_state_size + (12*sizeof(int)),
|
||||
__FUNCTION__);
|
||||
|
||||
|
||||
r200EmitState(rmesa);
|
||||
r200EmitVertexAOS( rmesa,
|
||||
rmesa->swtcl.vertex_size,
|
||||
rmesa->swtcl.bo, 0);
|
||||
rmesa->radeon.swtcl.vertex_size,
|
||||
rmesa->radeon.dma.current,
|
||||
current_offset);
|
||||
|
||||
|
||||
r200EmitVbufPrim( rmesa,
|
||||
rmesa->swtcl.hw_primitive,
|
||||
rmesa->swtcl.numverts);
|
||||
rmesa->radeon.swtcl.hw_primitive,
|
||||
rmesa->radeon.swtcl.numverts);
|
||||
|
||||
radeon_bo_unref(rmesa->swtcl.bo);
|
||||
// COMMIT_BATCH();
|
||||
rmesa->swtcl.numverts = 0;
|
||||
}
|
||||
|
||||
|
||||
/* Alloc space in the current dma region.
|
||||
*/
|
||||
static INLINE void *
|
||||
r200AllocDmaLowVerts( r200ContextPtr rmesa, int nverts, int vsize )
|
||||
{
|
||||
GLuint bytes = vsize * nverts;
|
||||
|
||||
if (rmesa->swtcl.flush)
|
||||
rmesa->swtcl.flush(rmesa->radeon.glCtx);
|
||||
|
||||
rmesa->swtcl.bo = radeon_bo_open(rmesa->radeon.radeonScreen->bom,
|
||||
0, bytes, 4, RADEON_GEM_DOMAIN_GTT, 0);
|
||||
radeon_bo_map(rmesa->swtcl.bo, 1);
|
||||
if (rmesa->radeon.dma.flush == NULL) {
|
||||
rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
|
||||
rmesa->radeon.dma.flush = flush_last_swtcl_prim;
|
||||
}
|
||||
rmesa->swtcl.numverts = nverts;
|
||||
return rmesa->swtcl.bo->ptr;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************/
|
||||
|
||||
|
||||
|
|
@ -374,11 +335,11 @@ static void r200ResetLineStipple( GLcontext *ctx );
|
|||
#undef LOCAL_VARS
|
||||
#undef ALLOC_VERTS
|
||||
#define CTX_ARG r200ContextPtr rmesa
|
||||
#define GET_VERTEX_DWORDS() rmesa->swtcl.vertex_size
|
||||
#define ALLOC_VERTS( n, size ) r200AllocDmaLowVerts( rmesa, n, size * 4 )
|
||||
#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
|
||||
#define ALLOC_VERTS( n, size ) rcommonAllocDmaLowVerts( &rmesa->radeon, n, size * 4 )
|
||||
#define LOCAL_VARS \
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx); \
|
||||
const char *r200verts = (char *)rmesa->swtcl.verts;
|
||||
const char *r200verts = (char *)rmesa->radeon.swtcl.verts;
|
||||
#define VERT(x) (radeonVertex *)(r200verts + ((x) * vertsize * sizeof(int)))
|
||||
#define VERTEX radeonVertex
|
||||
#define DO_DEBUG_VERTS (1 && (R200_DEBUG & DEBUG_VERTS))
|
||||
|
|
@ -438,7 +399,7 @@ static struct {
|
|||
#define VERT_Y(_v) _v->v.y
|
||||
#define VERT_Z(_v) _v->v.z
|
||||
#define AREA_IS_CCW( a ) (a < 0)
|
||||
#define GET_VERTEX(e) (rmesa->swtcl.verts + (e*rmesa->swtcl.vertex_size*sizeof(int)))
|
||||
#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + (e*rmesa->radeon.swtcl.vertex_size*sizeof(int)))
|
||||
|
||||
#define VERT_SET_RGBA( v, c ) \
|
||||
do { \
|
||||
|
|
@ -495,7 +456,7 @@ do { \
|
|||
***********************************************************************/
|
||||
|
||||
#define RASTERIZE(x) r200RasterPrimitive( ctx, reduced_hw_prim(ctx, x) )
|
||||
#define RENDER_PRIMITIVE rmesa->swtcl.render_primitive
|
||||
#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
|
||||
#undef TAG
|
||||
#define TAG(x) x
|
||||
#include "tnl_dd/t_dd_unfilled.h"
|
||||
|
|
@ -551,8 +512,8 @@ static void init_rast_tab( void )
|
|||
#undef LOCAL_VARS
|
||||
#define LOCAL_VARS \
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx); \
|
||||
const GLuint vertsize = rmesa->swtcl.vertex_size; \
|
||||
const char *r200verts = (char *)rmesa->swtcl.verts; \
|
||||
const GLuint vertsize = rmesa->radeon.swtcl.vertex_size; \
|
||||
const char *r200verts = (char *)rmesa->radeon.swtcl.verts; \
|
||||
const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
|
||||
const GLboolean stipple = ctx->Line.StippleFlag; \
|
||||
(void) elt; (void) stipple;
|
||||
|
|
@ -587,7 +548,7 @@ void r200ChooseRenderState( GLcontext *ctx )
|
|||
if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R200_TWOSIDE_BIT;
|
||||
if (flags & DD_TRI_UNFILLED) index |= R200_UNFILLED_BIT;
|
||||
|
||||
if (index != rmesa->swtcl.RenderIndex) {
|
||||
if (index != rmesa->radeon.swtcl.RenderIndex) {
|
||||
tnl->Driver.Render.Points = rast_tab[index].points;
|
||||
tnl->Driver.Render.Line = rast_tab[index].line;
|
||||
tnl->Driver.Render.ClippedLine = rast_tab[index].line;
|
||||
|
|
@ -604,7 +565,7 @@ void r200ChooseRenderState( GLcontext *ctx )
|
|||
tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
|
||||
}
|
||||
|
||||
rmesa->swtcl.RenderIndex = index;
|
||||
rmesa->radeon.swtcl.RenderIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -618,7 +579,7 @@ static void r200RasterPrimitive( GLcontext *ctx, GLuint hwprim )
|
|||
{
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx);
|
||||
|
||||
if (rmesa->swtcl.hw_primitive != hwprim) {
|
||||
if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
|
||||
/* need to disable perspective-correct texturing for point sprites */
|
||||
if ((hwprim & 0xf) == R200_VF_PRIM_POINT_SPRITES && ctx->Point.PointSprite) {
|
||||
if (rmesa->hw.set.cmd[SET_RE_CNTL] & R200_PERSPECTIVE_ENABLE) {
|
||||
|
|
@ -631,14 +592,14 @@ static void r200RasterPrimitive( GLcontext *ctx, GLuint hwprim )
|
|||
rmesa->hw.set.cmd[SET_RE_CNTL] |= R200_PERSPECTIVE_ENABLE;
|
||||
}
|
||||
R200_NEWPRIM( rmesa );
|
||||
rmesa->swtcl.hw_primitive = hwprim;
|
||||
rmesa->radeon.swtcl.hw_primitive = hwprim;
|
||||
}
|
||||
}
|
||||
|
||||
static void r200RenderPrimitive( GLcontext *ctx, GLenum prim )
|
||||
{
|
||||
r200ContextPtr rmesa = R200_CONTEXT(ctx);
|
||||
rmesa->swtcl.render_primitive = prim;
|
||||
rmesa->radeon.swtcl.render_primitive = prim;
|
||||
if (prim < GL_TRIANGLES || !(ctx->_TriangleCaps & DD_TRI_UNFILLED))
|
||||
r200RasterPrimitive( ctx, reduced_hw_prim(ctx, prim) );
|
||||
}
|
||||
|
|
@ -691,7 +652,7 @@ void r200Fallback( GLcontext *ctx, GLuint bit, GLboolean mode )
|
|||
R200_FIREVERTICES( rmesa );
|
||||
TCL_FALLBACK( ctx, R200_TCL_FALLBACK_RASTER, GL_TRUE );
|
||||
_swsetup_Wakeup( ctx );
|
||||
rmesa->swtcl.RenderIndex = ~0;
|
||||
rmesa->radeon.swtcl.RenderIndex = ~0;
|
||||
if (R200_DEBUG & DEBUG_FALLBACKS) {
|
||||
fprintf(stderr, "R200 begin rasterization fallback: 0x%x %s\n",
|
||||
bit, getFallbackString(bit));
|
||||
|
|
@ -776,7 +737,7 @@ r200PointsBitmap( GLcontext *ctx, GLint px, GLint py,
|
|||
vte |= R200_VTX_W0_FMT;
|
||||
vap &= ~R200_VAP_FORCE_W_TO_ONE;
|
||||
|
||||
rmesa->swtcl.vertex_size = 5;
|
||||
rmesa->radeon.swtcl.vertex_size = 5;
|
||||
|
||||
if ( (rmesa->hw.vtx.cmd[VTX_VTXFMT_0] != fmt_0)
|
||||
|| (rmesa->hw.vtx.cmd[VTX_VTXFMT_1] != fmt_1) ) {
|
||||
|
|
@ -944,10 +905,10 @@ void r200InitSwtcl( GLcontext *ctx )
|
|||
_tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
|
||||
36 * sizeof(GLfloat) );
|
||||
|
||||
rmesa->swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
|
||||
rmesa->swtcl.RenderIndex = ~0;
|
||||
rmesa->swtcl.render_primitive = GL_TRIANGLES;
|
||||
rmesa->swtcl.hw_primitive = 0;
|
||||
rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
|
||||
rmesa->radeon.swtcl.RenderIndex = ~0;
|
||||
rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
|
||||
rmesa->radeon.swtcl.hw_primitive = 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -66,5 +66,5 @@ extern void r200PointsBitmap( GLcontext *ctx, GLint px, GLint py,
|
|||
const struct gl_pixelstore_attrib *unpack,
|
||||
const GLubyte *bitmap );
|
||||
|
||||
|
||||
void r200_swtcl_flush(GLcontext *ctx, uint32_t current_offset);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@ static GLushort *r200AllocElts( r200ContextPtr rmesa, GLuint nr )
|
|||
if (rmesa->radeon.dma.flush)
|
||||
rmesa->radeon.dma.flush( rmesa->radeon.glCtx );
|
||||
|
||||
rcommonEnsureCmdBufSpace(rmesa, AOS_BUFSZ(rmesa->tcl.nr_aos_components));
|
||||
rcommonEnsureCmdBufSpace(&rmesa->radeon, AOS_BUFSZ(rmesa->tcl.nr_aos_components), __FUNCTION__);
|
||||
|
||||
r200EmitAOS( rmesa,
|
||||
rmesa->tcl.nr_aos_components, 0 );
|
||||
|
|
@ -190,7 +190,7 @@ static void r200EmitPrim( GLcontext *ctx,
|
|||
// fprintf(stderr,"Emit prim %d\n", rmesa->tcl.nr_aos_components);
|
||||
rcommonEnsureCmdBufSpace( &rmesa->radeon,
|
||||
AOS_BUFSZ(rmesa->tcl.nr_aos_components) +
|
||||
rmesa->hw.max_state_size + VBUF_BUFSZ );
|
||||
rmesa->hw.max_state_size + VBUF_BUFSZ, __FUNCTION__ );
|
||||
|
||||
r200EmitAOS( rmesa,
|
||||
rmesa->tcl.nr_aos_components,
|
||||
|
|
|
|||
|
|
@ -260,6 +260,7 @@ static void r300_init_vtbl(radeonContextPtr radeon)
|
|||
radeon->vtbl.emit_cs_header = r300_vtbl_emit_cs_header;
|
||||
radeon->vtbl.emit_state = r300_vtbl_emit_state;
|
||||
radeon->vtbl.flush_vertices = r300_vtbl_flush_vertices;
|
||||
radeon->vtbl.swtcl_flush = r300_swtcl_flush;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -658,37 +658,7 @@ struct r300_state {
|
|||
/* r300_swtcl.c
|
||||
*/
|
||||
struct r300_swtcl_info {
|
||||
GLuint RenderIndex;
|
||||
|
||||
/**
|
||||
* Size of a hardware vertex. This is calculated when \c ::vertex_attrs is
|
||||
* installed in the Mesa state vector.
|
||||
*/
|
||||
GLuint vertex_size;
|
||||
|
||||
/**
|
||||
* Attributes instructing the Mesa TCL pipeline where / how to put vertex
|
||||
* data in the hardware buffer.
|
||||
*/
|
||||
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
|
||||
|
||||
/**
|
||||
* Number of elements of \c ::vertex_attrs that are actually used.
|
||||
*/
|
||||
GLuint vertex_attr_count;
|
||||
|
||||
/**
|
||||
* Cached pointer to the buffer where Mesa will store vertex data.
|
||||
*/
|
||||
GLubyte *verts;
|
||||
|
||||
/* Fallback rasterization functions
|
||||
*/
|
||||
GLuint hw_primitive;
|
||||
GLenum render_primitive;
|
||||
GLuint numverts;
|
||||
|
||||
/**
|
||||
/*
|
||||
* Offset of the 4UB color data within a hardware (swtcl) vertex.
|
||||
*/
|
||||
GLuint coloroffset;
|
||||
|
|
@ -697,8 +667,6 @@ struct r300_swtcl_info {
|
|||
* Offset of the 3UB specular color data within a hardware (swtcl) vertex.
|
||||
*/
|
||||
GLuint specoffset;
|
||||
|
||||
struct radeon_bo *bo;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -57,24 +57,21 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "r300_ioctl.h"
|
||||
#include "r300_emit.h"
|
||||
|
||||
static void flush_last_swtcl_prim( GLcontext *ctx);
|
||||
|
||||
|
||||
void r300EmitVertexAOS(r300ContextPtr rmesa, GLuint vertex_size, struct radeon_bo *bo, GLuint offset);
|
||||
void r300EmitVbufPrim(r300ContextPtr rmesa, GLuint primitive, GLuint vertex_nr);
|
||||
#define EMIT_ATTR( ATTR, STYLE ) \
|
||||
do { \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = (ATTR); \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = (STYLE); \
|
||||
rmesa->swtcl.vertex_attr_count++; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = (ATTR); \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = (STYLE); \
|
||||
rmesa->radeon.swtcl.vertex_attr_count++; \
|
||||
} while (0)
|
||||
|
||||
#define EMIT_PAD( N ) \
|
||||
do { \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].attrib = 0; \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].format = EMIT_PAD; \
|
||||
rmesa->swtcl.vertex_attrs[rmesa->swtcl.vertex_attr_count].offset = (N); \
|
||||
rmesa->swtcl.vertex_attr_count++; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].attrib = 0; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].format = EMIT_PAD; \
|
||||
rmesa->radeon.swtcl.vertex_attrs[rmesa->radeon.swtcl.vertex_attr_count].offset = (N); \
|
||||
rmesa->radeon.swtcl.vertex_attr_count++; \
|
||||
} while (0)
|
||||
|
||||
static void r300SetVertexFormat( GLcontext *ctx )
|
||||
|
|
@ -112,7 +109,7 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
|||
}
|
||||
|
||||
assert( VB->AttribPtr[VERT_ATTRIB_POS] != NULL );
|
||||
rmesa->swtcl.vertex_attr_count = 0;
|
||||
rmesa->radeon.swtcl.vertex_attr_count = 0;
|
||||
|
||||
/* EMIT_ATTR's must be in order as they tell t_vertex.c how to
|
||||
* build up a hardware vertex.
|
||||
|
|
@ -222,95 +219,20 @@ static void r300SetVertexFormat( GLcontext *ctx )
|
|||
rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten);
|
||||
rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = vap_fmt_1;
|
||||
|
||||
rmesa->swtcl.vertex_size =
|
||||
rmesa->radeon.swtcl.vertex_size =
|
||||
_tnl_install_attrs( ctx,
|
||||
rmesa->swtcl.vertex_attrs,
|
||||
rmesa->swtcl.vertex_attr_count,
|
||||
rmesa->radeon.swtcl.vertex_attrs,
|
||||
rmesa->radeon.swtcl.vertex_attr_count,
|
||||
NULL, 0 );
|
||||
|
||||
rmesa->swtcl.vertex_size /= 4;
|
||||
rmesa->radeon.swtcl.vertex_size /= 4;
|
||||
|
||||
RENDERINPUTS_COPY( rmesa->tnl_index_bitset, index_bitset );
|
||||
|
||||
|
||||
R300_STATECHANGE(rmesa, vte);
|
||||
rmesa->hw.vte.cmd[1] = vte;
|
||||
rmesa->hw.vte.cmd[2] = rmesa->swtcl.vertex_size;
|
||||
}
|
||||
|
||||
|
||||
/* Flush vertices in the current dma region.
|
||||
*/
|
||||
static void flush_last_swtcl_prim( GLcontext *ctx )
|
||||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
struct radeon_dma *dma = &rmesa->radeon.dma;
|
||||
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
dma->flush = NULL;
|
||||
|
||||
if (dma->current) {
|
||||
GLuint current_offset = dma->current_used;
|
||||
|
||||
assert (dma->current_used +
|
||||
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
|
||||
dma->current_vertexptr);
|
||||
|
||||
radeon_bo_unmap(dma->current);
|
||||
if (dma->current_used != dma->current_vertexptr) {
|
||||
dma->current_used = dma->current_vertexptr;
|
||||
|
||||
rcommonEnsureCmdBufSpace(rmesa,
|
||||
rmesa->hw.max_state_size + (12*sizeof(int)),
|
||||
__FUNCTION__);
|
||||
r300EmitState(rmesa);
|
||||
r300EmitVertexAOS(rmesa,
|
||||
rmesa->swtcl.vertex_size,
|
||||
dma->current,
|
||||
current_offset);
|
||||
|
||||
r300EmitVbufPrim(rmesa,
|
||||
rmesa->swtcl.hw_primitive,
|
||||
rmesa->swtcl.numverts);
|
||||
r300EmitCacheFlush(rmesa);
|
||||
COMMIT_BATCH();
|
||||
}
|
||||
radeonReleaseDmaRegion(&rmesa->radeon);
|
||||
rmesa->swtcl.numverts = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Alloc space in the current dma region.
|
||||
*/
|
||||
static void *
|
||||
r300AllocDmaLowVerts( r300ContextPtr rmesa, int nverts, int vsize )
|
||||
{
|
||||
GLuint bytes = vsize * nverts;
|
||||
void *head;
|
||||
|
||||
if (!rmesa->radeon.dma.current || rmesa->radeon.dma.current_vertexptr + bytes > rmesa->radeon.dma.current->size) {
|
||||
radeonRefillCurrentDmaRegion( &rmesa->radeon, bytes);
|
||||
}
|
||||
|
||||
if (!rmesa->radeon.dma.flush) {
|
||||
rmesa->radeon.glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
|
||||
rmesa->radeon.dma.flush = flush_last_swtcl_prim;
|
||||
}
|
||||
|
||||
ASSERT( vsize == rmesa->swtcl.vertex_size * 4 );
|
||||
ASSERT( rmesa->radeon.dma.flush == flush_last_swtcl_prim );
|
||||
ASSERT( rmesa->radeon.dma.current_used +
|
||||
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
|
||||
rmesa->radeon.dma.current_vertexptr );
|
||||
|
||||
// fprintf(stderr,"current %p %x\n", rmesa->radeon.dma.current->ptr,
|
||||
// rmesa->radeon.dma.current_vertexptr);
|
||||
head = (rmesa->radeon.dma.current->ptr + rmesa->radeon.dma.current_vertexptr);
|
||||
rmesa->radeon.dma.current_vertexptr += bytes;
|
||||
rmesa->swtcl.numverts += nverts;
|
||||
return head;
|
||||
rmesa->hw.vte.cmd[2] = rmesa->radeon.swtcl.vertex_size;
|
||||
}
|
||||
|
||||
static GLuint reduced_prim[] = {
|
||||
|
|
@ -350,11 +272,11 @@ static void r300RenderPrimitive( GLcontext *ctx, GLenum prim );
|
|||
#undef LOCAL_VARS
|
||||
#undef ALLOC_VERTS
|
||||
#define CTX_ARG r300ContextPtr rmesa
|
||||
#define GET_VERTEX_DWORDS() rmesa->swtcl.vertex_size
|
||||
#define ALLOC_VERTS( n, size ) r300AllocDmaLowVerts( rmesa, n, size * 4 )
|
||||
#define GET_VERTEX_DWORDS() rmesa->radeon.swtcl.vertex_size
|
||||
#define ALLOC_VERTS( n, size ) rcommonAllocDmaLowVerts( &rmesa->radeon, n, size * 4 )
|
||||
#define LOCAL_VARS \
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx); \
|
||||
const char *r300verts = (char *)rmesa->swtcl.verts;
|
||||
const char *r300verts = (char *)rmesa->radeon.swtcl.verts;
|
||||
#define VERT(x) (r300Vertex *)(r300verts + ((x) * vertsize * sizeof(int)))
|
||||
#define VERTEX r300Vertex
|
||||
#define DO_DEBUG_VERTS (1 && (RADEON_DEBUG & DEBUG_VERTS))
|
||||
|
|
@ -413,7 +335,7 @@ static struct {
|
|||
#define VERT_Y(_v) _v->v.y
|
||||
#define VERT_Z(_v) _v->v.z
|
||||
#define AREA_IS_CCW( a ) (a < 0)
|
||||
#define GET_VERTEX(e) (rmesa->swtcl.verts + (e*rmesa->swtcl.vertex_size*sizeof(int)))
|
||||
#define GET_VERTEX(e) (rmesa->radeon.swtcl.verts + (e*rmesa->radeon.swtcl.vertex_size*sizeof(int)))
|
||||
|
||||
/* Only used to pull back colors into vertices (ie, we know color is
|
||||
* floating point).
|
||||
|
|
@ -459,7 +381,7 @@ do { \
|
|||
***********************************************************************/
|
||||
|
||||
#define RASTERIZE(x) r300RasterPrimitive( ctx, reduced_prim[x] )
|
||||
#define RENDER_PRIMITIVE rmesa->swtcl.render_primitive
|
||||
#define RENDER_PRIMITIVE rmesa->radeon.swtcl.render_primitive
|
||||
#undef TAG
|
||||
#define TAG(x) x
|
||||
#include "tnl_dd/t_dd_unfilled.h"
|
||||
|
|
@ -516,8 +438,8 @@ static void init_rast_tab( void )
|
|||
#undef LOCAL_VARS
|
||||
#define LOCAL_VARS \
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx); \
|
||||
const GLuint vertsize = rmesa->swtcl.vertex_size; \
|
||||
const char *r300verts = (char *)rmesa->swtcl.verts; \
|
||||
const GLuint vertsize = rmesa->radeon.swtcl.vertex_size; \
|
||||
const char *r300verts = (char *)rmesa->radeon.swtcl.verts; \
|
||||
const GLuint * const elt = TNL_CONTEXT(ctx)->vb.Elts; \
|
||||
const GLboolean stipple = ctx->Line.StippleFlag; \
|
||||
(void) elt; (void) stipple;
|
||||
|
|
@ -549,7 +471,7 @@ static void r300ChooseRenderState( GLcontext *ctx )
|
|||
if (flags & DD_TRI_LIGHT_TWOSIDE) index |= R300_TWOSIDE_BIT;
|
||||
if (flags & DD_TRI_UNFILLED) index |= R300_UNFILLED_BIT;
|
||||
|
||||
if (index != rmesa->swtcl.RenderIndex) {
|
||||
if (index != rmesa->radeon.swtcl.RenderIndex) {
|
||||
tnl->Driver.Render.Points = rast_tab[index].points;
|
||||
tnl->Driver.Render.Line = rast_tab[index].line;
|
||||
tnl->Driver.Render.ClippedLine = rast_tab[index].line;
|
||||
|
|
@ -566,7 +488,7 @@ static void r300ChooseRenderState( GLcontext *ctx )
|
|||
tnl->Driver.Render.ClippedPolygon = _tnl_RenderClippedPolygon;
|
||||
}
|
||||
|
||||
rmesa->swtcl.RenderIndex = index;
|
||||
rmesa->radeon.swtcl.RenderIndex = index;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -598,9 +520,9 @@ static void r300RasterPrimitive( GLcontext *ctx, GLuint hwprim )
|
|||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
|
||||
if (rmesa->swtcl.hw_primitive != hwprim) {
|
||||
if (rmesa->radeon.swtcl.hw_primitive != hwprim) {
|
||||
R300_NEWPRIM( rmesa );
|
||||
rmesa->swtcl.hw_primitive = hwprim;
|
||||
rmesa->radeon.swtcl.hw_primitive = hwprim;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -608,7 +530,7 @@ static void r300RenderPrimitive(GLcontext *ctx, GLenum prim)
|
|||
{
|
||||
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
rmesa->swtcl.render_primitive = prim;
|
||||
rmesa->radeon.swtcl.render_primitive = prim;
|
||||
|
||||
if ((prim == GL_TRIANGLES) && (ctx->_TriangleCaps & DD_TRI_UNFILLED))
|
||||
return;
|
||||
|
|
@ -647,10 +569,10 @@ void r300InitSwtcl(GLcontext *ctx)
|
|||
_tnl_init_vertices( ctx, ctx->Const.MaxArrayLockSize + 12,
|
||||
48 * sizeof(GLfloat) );
|
||||
|
||||
rmesa->swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
|
||||
rmesa->swtcl.RenderIndex = ~0;
|
||||
rmesa->swtcl.render_primitive = GL_TRIANGLES;
|
||||
rmesa->swtcl.hw_primitive = 0;
|
||||
rmesa->radeon.swtcl.verts = (GLubyte *)tnl->clipspace.vertex_buf;
|
||||
rmesa->radeon.swtcl.RenderIndex = ~0;
|
||||
rmesa->radeon.swtcl.render_primitive = GL_TRIANGLES;
|
||||
rmesa->radeon.swtcl.hw_primitive = 0;
|
||||
|
||||
_tnl_invalidate_vertex_state( ctx, ~0 );
|
||||
_tnl_invalidate_vertices( ctx, ~0 );
|
||||
|
|
@ -698,3 +620,24 @@ void r300EmitVbufPrim(r300ContextPtr rmesa, GLuint primitive, GLuint vertex_nr)
|
|||
OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type);
|
||||
END_BATCH();
|
||||
}
|
||||
|
||||
void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset)
|
||||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
|
||||
rcommonEnsureCmdBufSpace(&rmesa->radeon,
|
||||
rmesa->hw.max_state_size + (12*sizeof(int)),
|
||||
__FUNCTION__);
|
||||
r300EmitState(rmesa);
|
||||
r300EmitVertexAOS(rmesa,
|
||||
rmesa->radeon.swtcl.vertex_size,
|
||||
rmesa->radeon.dma.current,
|
||||
current_offset);
|
||||
|
||||
r300EmitVbufPrim(rmesa,
|
||||
rmesa->radeon.swtcl.hw_primitive,
|
||||
rmesa->radeon.swtcl.numverts);
|
||||
r300EmitCacheFlush(rmesa);
|
||||
COMMIT_BATCH();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,4 +42,5 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
extern void r300InitSwtcl( GLcontext *ctx );
|
||||
extern void r300DestroySwtcl( GLcontext *ctx );
|
||||
|
||||
extern void r300_swtcl_flush(GLcontext *ctx, uint32_t current_offset);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include "radeon_screen.h"
|
||||
#include "radeon_drm.h"
|
||||
#include "dri_util.h"
|
||||
#include "tnl/t_vertex.h"
|
||||
|
||||
/* This union is used to avoid warnings/miscompilation
|
||||
with float to uint32_t casts due to strict-aliasing */
|
||||
|
|
@ -250,13 +251,19 @@ struct radeon_dma {
|
|||
/* radeon_swtcl.c
|
||||
*/
|
||||
struct radeon_swtcl_info {
|
||||
struct radeon_bo *bo;
|
||||
|
||||
/* Fallback rasterization functions
|
||||
*/
|
||||
GLuint hw_primitive;
|
||||
GLenum render_primitive;
|
||||
GLuint numverts;
|
||||
GLuint RenderIndex;
|
||||
GLuint vertex_size;
|
||||
GLubyte *verts;
|
||||
|
||||
/* Fallback rasterization functions
|
||||
*/
|
||||
GLuint hw_primitive;
|
||||
GLenum render_primitive;
|
||||
GLuint numverts;
|
||||
|
||||
struct tnl_attr_map vertex_attrs[VERT_ATTRIB_MAX];
|
||||
GLuint vertex_attr_count;
|
||||
|
||||
};
|
||||
|
||||
|
|
@ -416,7 +423,7 @@ struct radeon_context {
|
|||
/* Derived state - for r300 only */
|
||||
struct radeon_state state;
|
||||
|
||||
struct radeon_swtcl swtcl;
|
||||
struct radeon_swtcl_info swtcl;
|
||||
/* Configuration cache
|
||||
*/
|
||||
driOptionCache optionCache;
|
||||
|
|
@ -424,14 +431,15 @@ struct radeon_context {
|
|||
struct radeon_cmdbuf cmdbuf;
|
||||
|
||||
struct {
|
||||
void (*get_lock)(radeonContextPtr radeon);
|
||||
void (*update_viewport_offset)(GLcontext *ctx);
|
||||
void (*flush)(GLcontext *ctx);
|
||||
void (*set_all_dirty)(GLcontext *ctx);
|
||||
void (*update_draw_buffer)(GLcontext *ctx);
|
||||
void (*emit_cs_header)(struct radeon_cs *cs, radeonContextPtr rmesa);
|
||||
void (*emit_state)(radeonContextPtr rmesa);
|
||||
void (*flush_vertices)(radeonContextPtr rmesa);
|
||||
void (*get_lock)(radeonContextPtr radeon);
|
||||
void (*update_viewport_offset)(GLcontext *ctx);
|
||||
void (*flush)(GLcontext *ctx);
|
||||
void (*set_all_dirty)(GLcontext *ctx);
|
||||
void (*update_draw_buffer)(GLcontext *ctx);
|
||||
void (*emit_cs_header)(struct radeon_cs *cs, radeonContextPtr rmesa);
|
||||
void (*emit_state)(radeonContextPtr rmesa);
|
||||
void (*flush_vertices)(radeonContextPtr rmesa);
|
||||
void (*swtcl_flush)(GLcontext *ctx, uint32_t offset);
|
||||
} vtbl;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -2420,46 +2420,46 @@ void radeonAllocDmaRegion(radeonContextPtr rmesa,
|
|||
|
||||
void radeonReleaseDmaRegion(radeonContextPtr rmesa)
|
||||
{
|
||||
rmesa->dma.nr_released_bufs++;
|
||||
radeon_bo_unref(rmesa->dma.current);
|
||||
if (rmesa->dma.current) {
|
||||
rmesa->dma.nr_released_bufs++;
|
||||
radeon_bo_unref(rmesa->dma.current);
|
||||
}
|
||||
rmesa->dma.current = NULL;
|
||||
}
|
||||
|
||||
void rcommonEmitVertexAOS(radeonContextPtr rmesa, GLuint vertex_size, struct radeon_bo *bo, GLuint offset)
|
||||
|
||||
/* Flush vertices in the current dma region.
|
||||
*/
|
||||
void rcommon_flush_last_swtcl_prim( GLcontext *ctx )
|
||||
{
|
||||
BATCH_LOCALS(rmesa);
|
||||
radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
|
||||
struct radeon_dma *dma = &rmesa->dma;
|
||||
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_VERTS)
|
||||
fprintf(stderr, "%s: vertex_size %d, offset 0x%x \n",
|
||||
__FUNCTION__, vertex_size, offset);
|
||||
if (RADEON_DEBUG & DEBUG_IOCTL)
|
||||
fprintf(stderr, "%s\n", __FUNCTION__);
|
||||
dma->flush = NULL;
|
||||
|
||||
BEGIN_BATCH(5);
|
||||
OUT_BATCH_PACKET3(R300_PACKET3_3D_LOAD_VBPNTR, 2);
|
||||
OUT_BATCH(1);
|
||||
OUT_BATCH(vertex_size | (vertex_size << 8));
|
||||
OUT_BATCH_RELOC(offset, bo, offset, RADEON_GEM_DOMAIN_GTT, 0, 0);
|
||||
END_BATCH();
|
||||
if (dma->current) {
|
||||
GLuint current_offset = dma->current_used;
|
||||
|
||||
assert (dma->current_used +
|
||||
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
|
||||
dma->current_vertexptr);
|
||||
|
||||
radeon_bo_unmap(dma->current);
|
||||
if (dma->current_used != dma->current_vertexptr) {
|
||||
dma->current_used = dma->current_vertexptr;
|
||||
|
||||
rmesa->vtbl.swtcl_flush(ctx, current_offset);
|
||||
}
|
||||
radeonReleaseDmaRegion(rmesa);
|
||||
rmesa->swtcl.numverts = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void rcommonEmitVbufPrim(radeonContextPtr rmesa, GLuint primitive, GLuint vertex_nr)
|
||||
{
|
||||
BATCH_LOCALS(rmesa);
|
||||
int type, num_verts;
|
||||
|
||||
type = r300PrimitiveType(rmesa, primitive);
|
||||
num_verts = r300NumVerts(rmesa, vertex_nr, primitive);
|
||||
|
||||
BEGIN_BATCH(3);
|
||||
OUT_BATCH_PACKET3(R300_PACKET3_3D_DRAW_VBUF_2, 0);
|
||||
OUT_BATCH(R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST | (num_verts << 16) | type);
|
||||
END_BATCH();
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Alloc space in the current dma region.
|
||||
*/
|
||||
static void *
|
||||
void *
|
||||
rcommonAllocDmaLowVerts( radeonContextPtr rmesa, int nverts, int vsize )
|
||||
{
|
||||
GLuint bytes = vsize * nverts;
|
||||
|
|
@ -2471,19 +2471,19 @@ rcommonAllocDmaLowVerts( radeonContextPtr rmesa, int nverts, int vsize )
|
|||
|
||||
if (!rmesa->dma.flush) {
|
||||
rmesa->glCtx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
|
||||
rmesa->dma.flush = flush_last_swtcl_prim;
|
||||
rmesa->dma.flush = rcommon_flush_last_swtcl_prim;
|
||||
}
|
||||
|
||||
ASSERT( vsize == rmesa->swtcl.vertex_size * 4 );
|
||||
ASSERT( rmesa->radeon.dma.flush == flush_last_swtcl_prim );
|
||||
ASSERT( rmesa->radeon.dma.current_used +
|
||||
ASSERT( rmesa->dma.flush == rcommon_flush_last_swtcl_prim );
|
||||
ASSERT( rmesa->dma.current_used +
|
||||
rmesa->swtcl.numverts * rmesa->swtcl.vertex_size * 4 ==
|
||||
rmesa->radeon.dma.current_vertexptr );
|
||||
rmesa->dma.current_vertexptr );
|
||||
|
||||
// fprintf(stderr,"current %p %x\n", rmesa->radeon.dma.current->ptr,
|
||||
// rmesa->radeon.dma.current_vertexptr);
|
||||
head = (rmesa->radeon.dma.current->ptr + rmesa->radeon.dma.current_vertexptr);
|
||||
rmesa->radeon.dma.current_vertexptr += bytes;
|
||||
head = (rmesa->dma.current->ptr + rmesa->dma.current_vertexptr);
|
||||
rmesa->dma.current_vertexptr += bytes;
|
||||
rmesa->swtcl.numverts += nverts;
|
||||
return head;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ struct cs_manager_legacy {
|
|||
/* hack for scratch stuff */
|
||||
uint32_t pending_age;
|
||||
uint32_t pending_count;
|
||||
|
||||
|
||||
};
|
||||
|
||||
struct cs_reloc_legacy {
|
||||
|
|
@ -507,3 +509,4 @@ void radeon_cs_manager_legacy_dtor(struct radeon_cs_manager *csm)
|
|||
{
|
||||
free(csm);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1015,6 +1015,7 @@ radeonCreateScreen( __DRIscreenPrivate *sPriv )
|
|||
free(screen);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return screen;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue