[Mesa-dev] Mesa (master): st/mesa: inline if(1) conditional
Jose Fonseca
jfonseca at vmware.com
Wed Jan 25 05:50:57 PST 2012
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 <maraeo at gmail.com>
> > 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
> > mesa-commit at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-commit
> >
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
More information about the mesa-dev
mailing list