i965: Add support for GL_FIXED vertex attributes.
This sadly requires work in the VS to rescale them, because the hardware doesn't support this format natively. Fixes arb_es2_compatibility-fixed-type and gtf/fixed_data_type. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
@@ -207,6 +207,10 @@ static GLuint get_surface_type( GLenum type, GLuint size,
|
|||||||
case GL_UNSIGNED_INT: return uint_types_scale[size];
|
case GL_UNSIGNED_INT: return uint_types_scale[size];
|
||||||
case GL_UNSIGNED_SHORT: return ushort_types_scale[size];
|
case GL_UNSIGNED_SHORT: return ushort_types_scale[size];
|
||||||
case GL_UNSIGNED_BYTE: return ubyte_types_scale[size];
|
case GL_UNSIGNED_BYTE: return ubyte_types_scale[size];
|
||||||
|
/* This produces GL_FIXED inputs as values between INT32_MIN and
|
||||||
|
* INT32_MAX, which will be scaled down by 1/65536 by the VS.
|
||||||
|
*/
|
||||||
|
case GL_FIXED: return int_types_scale[size];
|
||||||
default: assert(0); return 0;
|
default: assert(0); return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,6 +229,7 @@ static GLuint get_size( GLenum type )
|
|||||||
case GL_UNSIGNED_INT: return sizeof(GLuint);
|
case GL_UNSIGNED_INT: return sizeof(GLuint);
|
||||||
case GL_UNSIGNED_SHORT: return sizeof(GLushort);
|
case GL_UNSIGNED_SHORT: return sizeof(GLushort);
|
||||||
case GL_UNSIGNED_BYTE: return sizeof(GLubyte);
|
case GL_UNSIGNED_BYTE: return sizeof(GLubyte);
|
||||||
|
case GL_FIXED: return sizeof(GLuint);
|
||||||
default: assert(0); return 0;
|
default: assert(0); return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -145,6 +145,14 @@ static void brw_upload_vs_prog(struct brw_context *brw)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* BRW_NEW_VERTICES */
|
||||||
|
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
|
||||||
|
if (vp->program.Base.InputsRead & (1 << i) &&
|
||||||
|
brw->vb.inputs[i].glarray->Type == GL_FIXED) {
|
||||||
|
key.gl_fixed_input_size[i] = brw->vb.inputs[i].glarray->Size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Make an early check for the key.
|
/* Make an early check for the key.
|
||||||
*/
|
*/
|
||||||
drm_intel_bo_unreference(brw->vs.prog_bo);
|
drm_intel_bo_unreference(brw->vs.prog_bo);
|
||||||
@@ -164,7 +172,8 @@ const struct brw_tracked_state brw_vs_prog = {
|
|||||||
.dirty = {
|
.dirty = {
|
||||||
.mesa = (_NEW_TRANSFORM | _NEW_POLYGON | _NEW_POINT | _NEW_LIGHT |
|
.mesa = (_NEW_TRANSFORM | _NEW_POLYGON | _NEW_POINT | _NEW_LIGHT |
|
||||||
_NEW_BUFFERS),
|
_NEW_BUFFERS),
|
||||||
.brw = BRW_NEW_VERTEX_PROGRAM,
|
.brw = (BRW_NEW_VERTEX_PROGRAM |
|
||||||
|
BRW_NEW_VERTICES),
|
||||||
.cache = 0
|
.cache = 0
|
||||||
},
|
},
|
||||||
.prepare = brw_upload_vs_prog
|
.prepare = brw_upload_vs_prog
|
||||||
|
@@ -41,6 +41,10 @@
|
|||||||
|
|
||||||
struct brw_vs_prog_key {
|
struct brw_vs_prog_key {
|
||||||
GLuint program_string_id;
|
GLuint program_string_id;
|
||||||
|
/**
|
||||||
|
* Number of channels of the vertex attribute that need GL_FIXED rescaling
|
||||||
|
*/
|
||||||
|
uint8_t gl_fixed_input_size[VERT_ATTRIB_MAX];
|
||||||
GLuint nr_userclip:4;
|
GLuint nr_userclip:4;
|
||||||
GLuint copy_edgeflag:1;
|
GLuint copy_edgeflag:1;
|
||||||
GLuint point_coord_replace:8;
|
GLuint point_coord_replace:8;
|
||||||
|
@@ -1878,6 +1878,26 @@ get_predicate(const struct prog_instruction *inst)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
brw_vs_rescale_gl_fixed(struct brw_vs_compile *c)
|
||||||
|
{
|
||||||
|
struct brw_compile *p = &c->func;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
|
||||||
|
if (!(c->prog_data.inputs_read & (1 << i)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (c->key.gl_fixed_input_size[i] != 0) {
|
||||||
|
struct brw_reg reg = c->regs[PROGRAM_INPUT][i];
|
||||||
|
|
||||||
|
brw_MUL(p,
|
||||||
|
brw_writemask(reg, (1 << c->key.gl_fixed_input_size[i]) - 1),
|
||||||
|
reg, brw_imm_f(1.0 / 65536.0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Emit the vertex program instructions here.
|
/* Emit the vertex program instructions here.
|
||||||
*/
|
*/
|
||||||
void brw_vs_emit(struct brw_vs_compile *c )
|
void brw_vs_emit(struct brw_vs_compile *c )
|
||||||
@@ -1937,6 +1957,8 @@ void brw_vs_emit(struct brw_vs_compile *c )
|
|||||||
*/
|
*/
|
||||||
brw_vs_alloc_regs(c);
|
brw_vs_alloc_regs(c);
|
||||||
|
|
||||||
|
brw_vs_rescale_gl_fixed(c);
|
||||||
|
|
||||||
if (c->needs_stack)
|
if (c->needs_stack)
|
||||||
brw_MOV(p, get_addr_reg(stack_index), brw_address(c->stack));
|
brw_MOV(p, get_addr_reg(stack_index), brw_address(c->stack));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user