vbo_save: add support for doubles to display list code

Required for ARB_vertex_attrib_64bit compat profile support.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Dave Airlie
2018-06-28 12:40:20 +10:00
committed by Timothy Arceri
parent d2caa37741
commit 98d02104a7
4 changed files with 29 additions and 12 deletions
+1 -1
View File
@@ -4432,7 +4432,7 @@ struct gl_dlist_state
GLvertexformat ListVtxfmt;
GLubyte ActiveAttribSize[VERT_ATTRIB_MAX];
GLfloat CurrentAttrib[VERT_ATTRIB_MAX][4];
GLfloat CurrentAttrib[VERT_ATTRIB_MAX][8];
GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX];
GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4];
+3
View File
@@ -214,6 +214,9 @@ _vbo_set_attrib_format(struct gl_context *ctx,
{
const GLboolean integer = vbo_attrtype_to_integer_flag(type);
const GLboolean doubles = vbo_attrtype_to_double_flag(type);
if (doubles)
size /= 2;
_mesa_update_array_format(ctx, vao, attr, size, type, GL_RGBA,
GL_FALSE, integer, doubles, offset);
/* Ptr for userspace arrays.
+12 -6
View File
@@ -791,9 +791,12 @@ copy_to_current(struct gl_context *ctx)
const int i = u_bit_scan64(&enabled);
assert(save->attrsz[i]);
save->currentsz[i][0] = save->attrsz[i];
COPY_CLEAN_4V_TYPE_AS_UNION(save->current[i], save->attrsz[i],
save->attrptr[i], save->attrtype[i]);
if (save->attrtype[i] == GL_DOUBLE ||
save->attrtype[i] == GL_UNSIGNED_INT64_ARB)
memcpy(save->current[i], save->attrptr[i], save->attrsz[i] * sizeof(GLfloat));
else
COPY_CLEAN_4V_TYPE_AS_UNION(save->current[i], save->attrsz[i],
save->attrptr[i], save->attrtype[i]);
}
}
@@ -935,11 +938,13 @@ upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz)
* get a glTexCoord4f() or glTexCoord1f() call.
*/
static void
fixup_vertex(struct gl_context *ctx, GLuint attr, GLuint sz)
fixup_vertex(struct gl_context *ctx, GLuint attr,
GLuint sz, GLenum newType)
{
struct vbo_save_context *save = &vbo_context(ctx)->save;
if (sz > save->attrsz[attr]) {
if (sz > save->attrsz[attr] ||
newType != save->attrtype[attr]) {
/* New size is larger. Need to flush existing vertices and get
* an enlarged vertex format.
*/
@@ -994,9 +999,10 @@ reset_vertex(struct gl_context *ctx)
#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3) \
do { \
struct vbo_save_context *save = &vbo_context(ctx)->save; \
int sz = (sizeof(C) / sizeof(GLfloat)); \
\
if (save->active_sz[A] != N) \
fixup_vertex(ctx, A, N); \
fixup_vertex(ctx, A, N * sz, T); \
\
{ \
C *dest = (C *)save->attrptr[A]; \
+13 -5
View File
@@ -54,16 +54,24 @@ copy_vao(struct gl_context *ctx, const struct gl_vertex_array_object *vao,
struct gl_array_attributes *currval = &vbo->current[shift + i];
const GLubyte size = attrib->Size;
const GLenum16 type = attrib->Type;
fi_type tmp[4];
fi_type tmp[8];
int dmul = 1;
COPY_CLEAN_4V_TYPE_AS_UNION(tmp, size, *data, type);
if (type == GL_DOUBLE ||
type == GL_UNSIGNED_INT64_ARB)
dmul = 2;
if (dmul == 2)
memcpy(tmp, *data, size * dmul * sizeof(GLfloat));
else
COPY_CLEAN_4V_TYPE_AS_UNION(tmp, size, *data, type);
if (type != currval->Type ||
memcmp(currval->Ptr, tmp, 4 * sizeof(GLfloat)) != 0) {
memcpy((fi_type*)currval->Ptr, tmp, 4 * sizeof(GLfloat));
memcmp(currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul) != 0) {
memcpy((fi_type*)currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul);
currval->Size = size;
currval->_ElementSize = size * sizeof(GLfloat);
currval->_ElementSize = size * sizeof(GLfloat) * dmul;
currval->Type = type;
currval->Integer = vbo_attrtype_to_integer_flag(type);
currval->Doubles = vbo_attrtype_to_double_flag(type);