mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-02 06:40:22 +01:00
r600c: pull over 6xx/7xx vertex fixes for evergreen
This commit is contained in:
parent
0ab9d8d94b
commit
d6e2b707ba
3 changed files with 42 additions and 58 deletions
|
|
@ -275,7 +275,6 @@ static void evergreenSetupVTXConstants(GLcontext * ctx,
|
|||
{
|
||||
context_t *context = EVERGREEN_CONTEXT(ctx);
|
||||
struct radeon_aos * paos = (struct radeon_aos *)pAos;
|
||||
unsigned int nVBsize;
|
||||
BATCH_LOCALS(&context->radeon);
|
||||
|
||||
unsigned int uSQ_VTX_CONSTANT_WORD0_0;
|
||||
|
|
@ -289,21 +288,11 @@ static void evergreenSetupVTXConstants(GLcontext * ctx,
|
|||
|
||||
r700SyncSurf(context, paos->bo, RADEON_GEM_DOMAIN_GTT, 0, VC_ACTION_ENA_bit);
|
||||
|
||||
if(0 == pStreamDesc->stride)
|
||||
{
|
||||
nVBsize = paos->count * pStreamDesc->size * getTypeSize(pStreamDesc->type);
|
||||
}
|
||||
else
|
||||
{
|
||||
nVBsize = (paos->count - 1) * pStreamDesc->stride
|
||||
+ pStreamDesc->size * getTypeSize(pStreamDesc->type);
|
||||
}
|
||||
|
||||
//uSQ_VTX_CONSTANT_WORD0_0
|
||||
uSQ_VTX_CONSTANT_WORD0_0 = paos->offset;
|
||||
|
||||
//uSQ_VTX_CONSTANT_WORD1_0
|
||||
uSQ_VTX_CONSTANT_WORD1_0 = nVBsize;
|
||||
uSQ_VTX_CONSTANT_WORD1_0 = paos->bo->size - paos->offset - 1;
|
||||
|
||||
//uSQ_VTX_CONSTANT_WORD2_0
|
||||
SETfield(uSQ_VTX_CONSTANT_WORD2_0,
|
||||
|
|
@ -391,17 +380,6 @@ static void evergreenSendVTX(GLcontext *ctx, struct radeon_state_atom *atom)
|
|||
if (context->radeon.tcl.aos_count == 0)
|
||||
return;
|
||||
|
||||
BEGIN_BATCH_NO_AUTOSTATE(6);
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
|
||||
R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
|
||||
R600_OUT_BATCH(0);
|
||||
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 1));
|
||||
R600_OUT_BATCH(mmSQ_VTX_START_INST_LOC - ASIC_CTL_CONST_BASE_INDEX);
|
||||
R600_OUT_BATCH(0);
|
||||
END_BATCH();
|
||||
COMMIT_BATCH();
|
||||
|
||||
for(i=0; i<VERT_ATTRIB_MAX; i++) {
|
||||
if(vp->mesa_program->Base.InputsRead & (1 << i))
|
||||
{
|
||||
|
|
@ -410,7 +388,7 @@ static void evergreenSendVTX(GLcontext *ctx, struct radeon_state_atom *atom)
|
|||
&(context->stream_desc[j]));
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static void evergreenSendPA(GLcontext *ctx, struct radeon_state_atom *atom)
|
||||
{
|
||||
|
|
@ -1522,7 +1500,7 @@ void evergreenInitAtoms(context_t *context)
|
|||
context->radeon.hw.atomlist.name = "atom-list";
|
||||
|
||||
EVERGREEN_ALLOC_STATE(init, always, 19, evergreenSendSQConfig);
|
||||
EVERGREEN_ALLOC_STATE(vtx, evergreen_vtx, (6 + (VERT_ATTRIB_MAX * 12)), evergreenSendVTX);
|
||||
EVERGREEN_ALLOC_STATE(vtx, evergreen_vtx, (VERT_ATTRIB_MAX * 12), evergreenSendVTX);
|
||||
EVERGREEN_ALLOC_STATE(pa, always, 124, evergreenSendPA);
|
||||
EVERGREEN_ALLOC_STATE(tp, always, 0, evergreenSendTP);
|
||||
EVERGREEN_ALLOC_STATE(sq, always, 86, evergreenSendSQ); /* 85 */
|
||||
|
|
|
|||
|
|
@ -148,7 +148,8 @@ static int evergreenNumVerts(int num_verts, int prim) //same
|
|||
return num_verts - verts_off;
|
||||
}
|
||||
|
||||
static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int prim) //same
|
||||
static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int prim,
|
||||
GLint basevertex) //same
|
||||
{
|
||||
context_t *context = EVERGREEN_CONTEXT(ctx);
|
||||
BATCH_LOCALS(&context->radeon);
|
||||
|
|
@ -186,6 +187,7 @@ static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int
|
|||
total_emit = 3 /* VGT_PRIMITIVE_TYPE */
|
||||
+ 2 /* VGT_INDEX_TYPE */
|
||||
+ 2 /* NUM_INSTANCES */
|
||||
+ 4 /* VTX_BASE_VTX_LOC + VTX_START_INST_LOC */
|
||||
+ 5 + 2; /* DRAW_INDEX */
|
||||
|
||||
BEGIN_BATCH_NO_AUTOSTATE(total_emit);
|
||||
|
|
@ -198,6 +200,11 @@ static void evergreenRunRenderPrimitive(GLcontext * ctx, int start, int end, int
|
|||
// num instances
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
|
||||
R600_OUT_BATCH(1);
|
||||
/* offset */
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 2));
|
||||
R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
|
||||
R600_OUT_BATCH(basevertex); //VTX_BASE_VTX_LOC
|
||||
R600_OUT_BATCH(0); //VTX_START_INST_LOC
|
||||
// draw packet
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_DRAW_INDEX, 3));
|
||||
R600_OUT_BATCH(context->ind_buf.bo_offset);
|
||||
|
|
@ -268,6 +275,7 @@ static void evergreenRunRenderPrimitiveImmediate(GLcontext * ctx, int start, int
|
|||
total_emit += 3 /* VGT_PRIMITIVE_TYPE */
|
||||
+ 2 /* VGT_INDEX_TYPE */
|
||||
+ 2 /* NUM_INSTANCES */
|
||||
+ 4 /* VTX_BASE_VTX_LOC + VTX_START_INST_LOC */
|
||||
+ 3; /* DRAW */
|
||||
|
||||
BEGIN_BATCH_NO_AUTOSTATE(total_emit);
|
||||
|
|
@ -280,6 +288,11 @@ static void evergreenRunRenderPrimitiveImmediate(GLcontext * ctx, int start, int
|
|||
// num instances
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_NUM_INSTANCES, 0));
|
||||
R600_OUT_BATCH(1);
|
||||
/* offset */
|
||||
R600_OUT_BATCH(CP_PACKET3(R600_IT_SET_CTL_CONST, 2));
|
||||
R600_OUT_BATCH(mmSQ_VTX_BASE_VTX_LOC - ASIC_CTL_CONST_BASE_INDEX);
|
||||
R600_OUT_BATCH(0); //VTX_BASE_VTX_LOC
|
||||
R600_OUT_BATCH(0); //VTX_START_INST_LOC
|
||||
// draw packet
|
||||
if(start == 0)
|
||||
{
|
||||
|
|
@ -527,16 +540,16 @@ static GLuint evergreenPredictRenderSize(GLcontext* ctx,
|
|||
|
||||
dwords = PRE_EMIT_STATE_BUFSZ;
|
||||
if (ib)
|
||||
dwords += nr_prims * 14;
|
||||
dwords += nr_prims * 18;
|
||||
else {
|
||||
for (i = 0; i < nr_prims; ++i)
|
||||
{
|
||||
if (prim[i].start == 0)
|
||||
dwords += 10;
|
||||
dwords += 14;
|
||||
else if (prim[i].count > 0xffff)
|
||||
dwords += prim[i].count + 10;
|
||||
dwords += prim[i].count + 14;
|
||||
else
|
||||
dwords += ((prim[i].count + 1) / 2) + 10;
|
||||
dwords += ((prim[i].count + 1) / 2) + 14;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -665,11 +678,11 @@ static void evergreenSetupStreams(GLcontext *ctx, const struct gl_client_array *
|
|||
|
||||
stride = (input[i]->StrideB == 0) ? getTypeSize(input[i]->Type) * input[i]->Size : input[i]->StrideB;
|
||||
|
||||
if (input[i]->Type == GL_DOUBLE || input[i]->Type == GL_UNSIGNED_INT || input[i]->Type == GL_INT ||
|
||||
if (input[i]->Type == GL_DOUBLE || input[i]->Type == GL_UNSIGNED_INT || input[i]->Type == GL_INT
|
||||
#if MESA_BIG_ENDIAN
|
||||
getTypeSize(input[i]->Type) != 4 ||
|
||||
|| getTypeSize(input[i]->Type) != 4
|
||||
#endif
|
||||
stride < 4)
|
||||
)
|
||||
{
|
||||
evergreenConvertAttrib(ctx, count, input[i], &context->stream_desc[index]);
|
||||
}
|
||||
|
|
@ -677,19 +690,10 @@ static void evergreenSetupStreams(GLcontext *ctx, const struct gl_client_array *
|
|||
{
|
||||
if (input[i]->BufferObj->Name)
|
||||
{
|
||||
if (stride % 4 != 0)
|
||||
{
|
||||
assert(((intptr_t) input[i]->Ptr) % input[i]->StrideB == 0);
|
||||
evergreenAlignDataToDword(ctx, input[i], count, &context->stream_desc[index]);
|
||||
context->stream_desc[index].is_named_bo = GL_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
context->stream_desc[index].stride = input[i]->StrideB;
|
||||
context->stream_desc[index].bo_offset = (intptr_t) input[i]->Ptr;
|
||||
context->stream_desc[index].bo = get_radeon_buffer_object(input[i]->BufferObj)->bo;
|
||||
context->stream_desc[index].is_named_bo = GL_TRUE;
|
||||
}
|
||||
context->stream_desc[index].stride = input[i]->StrideB;
|
||||
context->stream_desc[index].bo_offset = (intptr_t) input[i]->Ptr;
|
||||
context->stream_desc[index].bo = get_radeon_buffer_object(input[i]->BufferObj)->bo;
|
||||
context->stream_desc[index].is_named_bo = GL_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -857,7 +861,8 @@ static GLboolean evergreenTryDrawPrims(GLcontext *ctx,
|
|||
evergreenRunRenderPrimitive(ctx,
|
||||
prim[i].start,
|
||||
prim[i].start + prim[i].count,
|
||||
prim[i].mode);
|
||||
prim[i].mode,
|
||||
prim[i].basevertex);
|
||||
else
|
||||
evergreenRunRenderPrimitiveImmediate(ctx,
|
||||
prim[i].start,
|
||||
|
|
@ -907,15 +912,16 @@ static void evergreenDrawPrims(GLcontext *ctx,
|
|||
/* This check should get folded into just the places that
|
||||
* min/max index are really needed.
|
||||
*/
|
||||
if (!index_bounds_valid) {
|
||||
vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
|
||||
if (!vbo_all_varyings_in_vbos(arrays)) {
|
||||
if (!index_bounds_valid)
|
||||
vbo_get_minmax_index(ctx, prim, ib, &min_index, &max_index);
|
||||
/* do we want to rebase, minimizes the
|
||||
* amount of data to upload? */
|
||||
if (min_index) {
|
||||
vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, evergreenDrawPrims );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (min_index) {
|
||||
vbo_rebase_prims( ctx, arrays, prim, nr_prims, ib, min_index, max_index, evergreenDrawPrims );
|
||||
return;
|
||||
}
|
||||
|
||||
/* Make an attempt at drawing */
|
||||
retval = evergreenTryDrawPrims(ctx, arrays, prim, nr_prims, ib, min_index, max_index);
|
||||
|
||||
|
|
|
|||
|
|
@ -459,11 +459,11 @@ static void evergreenTranslateAttrib(GLcontext *ctx, GLuint unLoc, int count, co
|
|||
stride = (input->StrideB == 0) ? evergreen_getTypeSize(input->Type) * input->Size
|
||||
: input->StrideB;
|
||||
|
||||
if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT ||
|
||||
if (input->Type == GL_DOUBLE || input->Type == GL_UNSIGNED_INT || input->Type == GL_INT
|
||||
#if MESA_BIG_ENDIAN
|
||||
evergreen_getTypeSize(input->Type) != 4 ||
|
||||
|| evergreen_getTypeSize(input->Type) != 4
|
||||
#endif
|
||||
stride < 4)
|
||||
)
|
||||
{
|
||||
pStreamDesc->type = GL_FLOAT;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue