r600: relax stride/alignment requirements for vertices
seems hw can do unaligned accesses and unaligned strides removes extra conversion when using vbo's however I needed to switch 3 component byte format to 4 component formats for tests to pass. Somewhat sililar to GL_SHORT fix done earlier removes assert and gains +2 piglit especially draw-vertices
This commit is contained in:
@@ -275,7 +275,10 @@ GLuint GetSurfaceFormat(GLenum eType, GLuint nChannels, GLuint * pClient_size)
|
||||
case 2:
|
||||
format = FMT_8_8; break;
|
||||
case 3:
|
||||
format = FMT_8_8_8; break;
|
||||
/* for some (small/unaligned) strides using 4 comps works
|
||||
* better, probably same as GL_SHORT below
|
||||
* test piglit/draw-vertices */
|
||||
format = FMT_8_8_8_8; break;
|
||||
case 4:
|
||||
format = FMT_8_8_8_8; break;
|
||||
default:
|
||||
|
||||
@@ -625,11 +625,11 @@ static void r700SetupStreams(GLcontext *ctx, const struct gl_client_array *input
|
||||
|
||||
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)
|
||||
)
|
||||
{
|
||||
r700ConvertAttrib(ctx, count, input[i], &context->stream_desc[index]);
|
||||
}
|
||||
@@ -637,19 +637,10 @@ static void r700SetupStreams(GLcontext *ctx, const struct gl_client_array *input
|
||||
{
|
||||
if (input[i]->BufferObj->Name)
|
||||
{
|
||||
if (stride % 4 != 0)
|
||||
{
|
||||
assert(((intptr_t) input[i]->Ptr) % input[i]->StrideB == 0);
|
||||
r700AlignDataToDword(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
|
||||
{
|
||||
|
||||
@@ -461,11 +461,11 @@ static void r700TranslateAttrib(GLcontext *ctx, GLuint unLoc, int count, const s
|
||||
stride = (input->StrideB == 0) ? 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
|
||||
getTypeSize(input->Type) != 4 ||
|
||||
|| getTypeSize(input->Type) != 4
|
||||
#endif
|
||||
stride < 4)
|
||||
)
|
||||
{
|
||||
pStreamDesc->type = GL_FLOAT;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user