Marek, I'm seeing the following assertion failure
src/mesa/state_tracker/st_glsl_to_tgsi.cpp:4032:src_register: Assertion `t->inputMapping[index] < (sizeof(t->inputs)/sizeof(*(t->inputs)))' failed. all over the place (conform, glean, piglit) since the commit below. For example, doing /var/lib/hudson/tools/linux64/piglit/bin/pbo-drawpixels -auto w/ llvmpipe. Jose ----- Original Message ----- > Module: Mesa > Branch: master > Commit: 697b9945fb0f55428b06821f98fd8621372f81ad > URL: > > http://cgit.freedesktop.org/mesa/mesa/commit/?id=697b9945fb0f55428b06821f98fd8621372f81ad > > Author: Marek Olšák <[email protected]> > Date: Mon Jan 23 13:28:07 2012 +0100 > > st/mesa: inline if(1) conditional > > v2: fix typo > > --- > > src/mesa/state_tracker/st_program.c | 434 > +++++++++++++++++------------------ > 1 files changed, 215 insertions(+), 219 deletions(-) > > diff --git a/src/mesa/state_tracker/st_program.c > b/src/mesa/state_tracker/st_program.c > index 978de88..cebe390 100644 > --- a/src/mesa/state_tracker/st_program.c > +++ b/src/mesa/state_tracker/st_program.c > @@ -473,6 +473,23 @@ st_translate_fragment_program(struct st_context > *st, > struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); > GLboolean deleteFP = GL_FALSE; > > + GLuint outputMapping[FRAG_RESULT_MAX]; > + GLuint inputMapping[FRAG_ATTRIB_MAX]; > + GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ > + GLuint attr; > + const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead; > + struct ureg_program *ureg; > + > + GLboolean write_all = GL_FALSE; > + > + ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; > + ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; > + uint fs_num_inputs = 0; > + > + ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; > + ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; > + uint fs_num_outputs = 0; > + > if (!variant) > return NULL; > > @@ -508,243 +525,222 @@ st_translate_fragment_program(struct > st_context *st, > } > #endif > > - /* XXX this will be cleaned up in the following commit */ > - if (1) { > - /* need to translate Mesa instructions to TGSI now */ > - GLuint outputMapping[FRAG_RESULT_MAX]; > - GLuint inputMapping[FRAG_ATTRIB_MAX]; > - GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ > - GLuint attr; > - const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead; > - struct ureg_program *ureg; > - > - GLboolean write_all = GL_FALSE; > - > - ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; > - ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; > - uint fs_num_inputs = 0; > - > - ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; > - ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; > - uint fs_num_outputs = 0; > - > - if (!stfp->glsl_to_tgsi) > - _mesa_remove_output_reads(&stfp->Base.Base, > PROGRAM_OUTPUT); > + if (!stfp->glsl_to_tgsi) > + _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); > > - /* > - * Convert Mesa program inputs to TGSI input register > semantics. > - */ > - for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { > - if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { > - const GLuint slot = fs_num_inputs++; > + /* > + * Convert Mesa program inputs to TGSI input register semantics. > + */ > + for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { > + if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { > + const GLuint slot = fs_num_inputs++; > > - inputMapping[attr] = slot; > + inputMapping[attr] = slot; > > - switch (attr) { > - case FRAG_ATTRIB_WPOS: > - input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; > - input_semantic_index[slot] = 0; > + switch (attr) { > + case FRAG_ATTRIB_WPOS: > + input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; > + input_semantic_index[slot] = 0; > + interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > + break; > + case FRAG_ATTRIB_COL0: > + input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; > + input_semantic_index[slot] = 0; > + interpMode[slot] = > st_translate_interp(stfp->Base.InterpQualifier[attr], > + TRUE); > + break; > + case FRAG_ATTRIB_COL1: > + input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; > + input_semantic_index[slot] = 1; > + interpMode[slot] = > st_translate_interp(stfp->Base.InterpQualifier[attr], > + TRUE); > + break; > + case FRAG_ATTRIB_FOGC: > + input_semantic_name[slot] = TGSI_SEMANTIC_FOG; > + input_semantic_index[slot] = 0; > + interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; > + break; > + case FRAG_ATTRIB_FACE: > + input_semantic_name[slot] = TGSI_SEMANTIC_FACE; > + input_semantic_index[slot] = 0; > + interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; > + break; > + case FRAG_ATTRIB_CLIP_DIST0: > + input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; > + input_semantic_index[slot] = 0; > + interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > + break; > + case FRAG_ATTRIB_CLIP_DIST1: > + input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; > + input_semantic_index[slot] = 1; > + interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > + break; > + /* In most cases, there is nothing special about these > + * inputs, so adopt a convention to use the generic > + * semantic name and the mesa FRAG_ATTRIB_ number as the > + * index. > + * > + * All that is required is that the vertex shader labels > + * its own outputs similarly, and that the vertex shader > + * generates at least every output required by the > + * fragment shader plus fixed-function hardware (such as > + * BFC). > + * > + * There is no requirement that semantic indexes start > at > + * zero or be restricted to a particular range -- nobody > + * should be building tables based on semantic index. > + */ > + case FRAG_ATTRIB_PNTC: > + case FRAG_ATTRIB_TEX0: > + case FRAG_ATTRIB_TEX1: > + case FRAG_ATTRIB_TEX2: > + case FRAG_ATTRIB_TEX3: > + case FRAG_ATTRIB_TEX4: > + case FRAG_ATTRIB_TEX5: > + case FRAG_ATTRIB_TEX6: > + case FRAG_ATTRIB_TEX7: > + case FRAG_ATTRIB_VAR0: > + default: > + /* Actually, let's try and zero-base this just for > + * readability of the generated TGSI. > + */ > + assert(attr >= FRAG_ATTRIB_TEX0); > + input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); > + input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; > + if (attr == FRAG_ATTRIB_PNTC) > interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > - break; > - case FRAG_ATTRIB_COL0: > - input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; > - input_semantic_index[slot] = 0; > - interpMode[slot] = > st_translate_interp(stfp->Base.InterpQualifier[attr], > - TRUE); > - break; > - case FRAG_ATTRIB_COL1: > - input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; > - input_semantic_index[slot] = 1; > + else > interpMode[slot] = > st_translate_interp(stfp->Base.InterpQualifier[attr], > - TRUE); > - break; > - case FRAG_ATTRIB_FOGC: > - input_semantic_name[slot] = TGSI_SEMANTIC_FOG; > - input_semantic_index[slot] = 0; > - interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; > - break; > - case FRAG_ATTRIB_FACE: > - input_semantic_name[slot] = TGSI_SEMANTIC_FACE; > - input_semantic_index[slot] = 0; > - interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; > - break; > - case FRAG_ATTRIB_CLIP_DIST0: > - input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; > - input_semantic_index[slot] = 0; > - interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > - break; > - case FRAG_ATTRIB_CLIP_DIST1: > - input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; > - input_semantic_index[slot] = 1; > - interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > - break; > - /* In most cases, there is nothing special about > these > - * inputs, so adopt a convention to use the generic > - * semantic name and the mesa FRAG_ATTRIB_ number as > the > - * index. > - * > - * All that is required is that the vertex shader > labels > - * its own outputs similarly, and that the vertex > shader > - * generates at least every output required by the > - * fragment shader plus fixed-function hardware (such > as > - * BFC). > - * > - * There is no requirement that semantic indexes > start at > - * zero or be restricted to a particular range -- > nobody > - * should be building tables based on semantic index. > - */ > - case FRAG_ATTRIB_PNTC: > - case FRAG_ATTRIB_TEX0: > - case FRAG_ATTRIB_TEX1: > - case FRAG_ATTRIB_TEX2: > - case FRAG_ATTRIB_TEX3: > - case FRAG_ATTRIB_TEX4: > - case FRAG_ATTRIB_TEX5: > - case FRAG_ATTRIB_TEX6: > - case FRAG_ATTRIB_TEX7: > - case FRAG_ATTRIB_VAR0: > - default: > - /* Actually, let's try and zero-base this just for > - * readability of the generated TGSI. > - */ > - assert(attr >= FRAG_ATTRIB_TEX0); > - input_semantic_index[slot] = (attr - > FRAG_ATTRIB_TEX0); > - input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; > - if (attr == FRAG_ATTRIB_PNTC) > - interpMode[slot] = TGSI_INTERPOLATE_LINEAR; > - else > - interpMode[slot] = > st_translate_interp(stfp->Base.InterpQualifier[attr], > - FALSE); > - break; > - } > - } > - else { > - inputMapping[attr] = -1; > + FALSE); > + break; > } > } > - > - /* > - * Semantics and mapping for outputs > - */ > - { > - uint numColors = 0; > - GLbitfield64 outputsWritten = > stfp->Base.Base.OutputsWritten; > - > - /* if z is written, emit that first */ > - if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { > - fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_POSITION; > - fs_output_semantic_index[fs_num_outputs] = 0; > - outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; > - fs_num_outputs++; > - outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); > - } > - > - if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { > - fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_STENCIL; > - fs_output_semantic_index[fs_num_outputs] = 0; > - outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; > - fs_num_outputs++; > - outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); > - } > - > - /* handle remaning outputs (color) */ > - for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { > - if (outputsWritten & BITFIELD64_BIT(attr)) { > - switch (attr) { > - case FRAG_RESULT_DEPTH: > - case FRAG_RESULT_STENCIL: > - /* handled above */ > - assert(0); > - break; > - case FRAG_RESULT_COLOR: > - write_all = GL_TRUE; /* fallthrough */ > - default: > - assert(attr == FRAG_RESULT_COLOR || > - (FRAG_RESULT_DATA0 <= attr && attr < > FRAG_RESULT_MAX)); > - fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_COLOR; > - fs_output_semantic_index[fs_num_outputs] = > numColors; > - outputMapping[attr] = fs_num_outputs; > - numColors++; > - break; > - } > - > - fs_num_outputs++; > - } > - } > + else { > + inputMapping[attr] = -1; > } > + } > > - ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); > - if (ureg == NULL) { > - FREE(variant); > - return NULL; > + /* > + * Semantics and mapping for outputs > + */ > + { > + uint numColors = 0; > + GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; > + > + /* if z is written, emit that first */ > + if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { > + fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_POSITION; > + fs_output_semantic_index[fs_num_outputs] = 0; > + outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; > + fs_num_outputs++; > + outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); > } > > - if (ST_DEBUG & DEBUG_MESA) { > - _mesa_print_program(&stfp->Base.Base); > - _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); > - debug_printf("\n"); > + if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { > + fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_STENCIL; > + fs_output_semantic_index[fs_num_outputs] = 0; > + outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; > + fs_num_outputs++; > + outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); > } > - if (write_all == GL_TRUE) > - ureg_property_fs_color0_writes_all_cbufs(ureg, 1); > > - if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { > - switch (stfp->Base.FragDepthLayout) { > - case FRAG_DEPTH_LAYOUT_ANY: > - ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_ANY); > - break; > - case FRAG_DEPTH_LAYOUT_GREATER: > - ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_GREATER); > - break; > - case FRAG_DEPTH_LAYOUT_LESS: > - ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_LESS); > - break; > - case FRAG_DEPTH_LAYOUT_UNCHANGED: > - ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_UNCHANGED); > - break; > - default: > - assert(0); > + /* handle remaining outputs (color) */ > + for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { > + if (outputsWritten & BITFIELD64_BIT(attr)) { > + switch (attr) { > + case FRAG_RESULT_DEPTH: > + case FRAG_RESULT_STENCIL: > + /* handled above */ > + assert(0); > + break; > + case FRAG_RESULT_COLOR: > + write_all = GL_TRUE; /* fallthrough */ > + default: > + assert(attr == FRAG_RESULT_COLOR || > + (FRAG_RESULT_DATA0 <= attr && attr < > FRAG_RESULT_MAX)); > + fs_output_semantic_name[fs_num_outputs] = > TGSI_SEMANTIC_COLOR; > + fs_output_semantic_index[fs_num_outputs] = numColors; > + outputMapping[attr] = fs_num_outputs; > + numColors++; > + break; > + } > + > + fs_num_outputs++; > } > } > + } > > - if (stfp->glsl_to_tgsi) > - st_translate_program(st->ctx, > - TGSI_PROCESSOR_FRAGMENT, > - ureg, > - stfp->glsl_to_tgsi, > - &stfp->Base.Base, > - /* inputs */ > - fs_num_inputs, > - inputMapping, > - input_semantic_name, > - input_semantic_index, > - interpMode, > - /* outputs */ > - fs_num_outputs, > - outputMapping, > - fs_output_semantic_name, > - fs_output_semantic_index, FALSE, > - key->clamp_color ); > - else > - st_translate_mesa_program(st->ctx, > - TGSI_PROCESSOR_FRAGMENT, > - ureg, > - &stfp->Base.Base, > - /* inputs */ > - fs_num_inputs, > - inputMapping, > - input_semantic_name, > - input_semantic_index, > - interpMode, > - /* outputs */ > - fs_num_outputs, > - outputMapping, > - fs_output_semantic_name, > - fs_output_semantic_index, FALSE, > - key->clamp_color); > + ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); > + if (ureg == NULL) { > + FREE(variant); > + return NULL; > + } > > - variant->tgsi.tokens = ureg_get_tokens( ureg, NULL ); > - ureg_destroy( ureg ); > + if (ST_DEBUG & DEBUG_MESA) { > + _mesa_print_program(&stfp->Base.Base); > + _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); > + debug_printf("\n"); > } > + if (write_all == GL_TRUE) > + ureg_property_fs_color0_writes_all_cbufs(ureg, 1); > + > + if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { > + switch (stfp->Base.FragDepthLayout) { > + case FRAG_DEPTH_LAYOUT_ANY: > + ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_ANY); > + break; > + case FRAG_DEPTH_LAYOUT_GREATER: > + ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_GREATER); > + break; > + case FRAG_DEPTH_LAYOUT_LESS: > + ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_LESS); > + break; > + case FRAG_DEPTH_LAYOUT_UNCHANGED: > + ureg_property_fs_depth_layout(ureg, > TGSI_FS_DEPTH_LAYOUT_UNCHANGED); > + break; > + default: > + assert(0); > + } > + } > + > + if (stfp->glsl_to_tgsi) > + st_translate_program(st->ctx, > + TGSI_PROCESSOR_FRAGMENT, > + ureg, > + stfp->glsl_to_tgsi, > + &stfp->Base.Base, > + /* inputs */ > + fs_num_inputs, > + inputMapping, > + input_semantic_name, > + input_semantic_index, > + interpMode, > + /* outputs */ > + fs_num_outputs, > + outputMapping, > + fs_output_semantic_name, > + fs_output_semantic_index, FALSE, > + key->clamp_color ); > + else > + st_translate_mesa_program(st->ctx, > + TGSI_PROCESSOR_FRAGMENT, > + ureg, > + &stfp->Base.Base, > + /* inputs */ > + fs_num_inputs, > + inputMapping, > + input_semantic_name, > + input_semantic_index, > + interpMode, > + /* outputs */ > + fs_num_outputs, > + outputMapping, > + fs_output_semantic_name, > + fs_output_semantic_index, FALSE, > + key->clamp_color); > + > + variant->tgsi.tokens = ureg_get_tokens( ureg, NULL ); > + ureg_destroy( ureg ); > > /* fill in variant */ > variant->driver_shader = pipe->create_fs_state(pipe, > &variant->tgsi); > > _______________________________________________ > mesa-commit mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/mesa-commit > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
