It was easy. It's fixed now. Jose
----- Original Message ----- > 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 > _______________________________________________ mesa-dev mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/mesa-dev
