diff options
| -rw-r--r-- | configure.ac | 2 | ||||
| -rw-r--r-- | progs/glsl/reflect.vert | 1 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_build.c | 34 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_build.h | 1 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_dump.c | 28 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_exec.c | 51 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_parse.c | 12 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_parse.h | 1 | ||||
| -rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_text.c | 7 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/intel/intel_context.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r128/r128_state.c | 5 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r128/r128_tris.c | 2 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/r128/r128_tris.h | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_atom_shader.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_mesa_to_tgsi.c | 5 | ||||
| -rw-r--r-- | src/mesa/vbo/vbo_save_api.c | 5 | 
16 files changed, 138 insertions, 22 deletions
| diff --git a/configure.ac b/configure.ac index 6db237c793..409d9b935d 100644 --- a/configure.ac +++ b/configure.ac @@ -656,7 +656,7 @@ dnl Which drivers to build - default is chosen by platform  AC_ARG_WITH([dri-drivers],      [AS_HELP_STRING([--with-dri-drivers@<:@=DIRS...@:>@],          [comma delimited DRI drivers list, e.g. -        "swrast,i965,radeon,nouveau" @<:@default=auto@:>@])], +        "swrast,i965,radeon" @<:@default=auto@:>@])],      [with_dri_drivers="$withval"],      [with_dri_drivers=yes])  if test "x$with_dri_drivers" = x; then diff --git a/progs/glsl/reflect.vert b/progs/glsl/reflect.vert index 402be38bf7..e1f22def33 100644 --- a/progs/glsl/reflect.vert +++ b/progs/glsl/reflect.vert @@ -11,6 +11,7 @@ void main()     float two_n_dot_u = 2.0 * dot(n, u);     vec4 f;     f.xyz = u - n * two_n_dot_u; +   f.w = 1.0;     // outputs     normal = n; diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c index a1891a140a..d272533d63 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_build.c +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c @@ -139,8 +139,8 @@ tgsi_build_declaration(  {     struct tgsi_declaration declaration; -   assert( file <= TGSI_FILE_IMMEDIATE ); -   assert( interpolate <= TGSI_INTERPOLATE_PERSPECTIVE ); +   assert( file < TGSI_FILE_COUNT ); +   assert( interpolate < TGSI_INTERPOLATE_COUNT );     declaration = tgsi_default_declaration();     declaration.File = file; @@ -584,6 +584,7 @@ tgsi_build_full_instruction(        *dst_register = tgsi_build_dst_register(           reg->DstRegister.File,           reg->DstRegister.WriteMask, +         reg->DstRegister.Indirect,           reg->DstRegister.Index,           instruction,           header ); @@ -631,6 +632,28 @@ tgsi_build_full_instruction(              header );           prev_token = (struct tgsi_token  *) dst_register_ext_modulate;        } + +      if( reg->DstRegister.Indirect ) { +         struct tgsi_src_register *ind; + +         if( maxsize <= size ) +            return 0; +         ind = (struct tgsi_src_register *) &tokens[size]; +         size++; + +         *ind = tgsi_build_src_register( +            reg->DstRegisterInd.File, +            reg->DstRegisterInd.SwizzleX, +            reg->DstRegisterInd.SwizzleY, +            reg->DstRegisterInd.SwizzleZ, +            reg->DstRegisterInd.SwizzleW, +            reg->DstRegisterInd.Negate, +            reg->DstRegisterInd.Indirect, +            reg->DstRegisterInd.Dimension, +            reg->DstRegisterInd.Index, +            instruction, +            header ); +      }     }     for( i = 0;  i < full_inst->Instruction.NumSrcRegs; i++ ) { @@ -973,7 +996,7 @@ tgsi_build_src_register(  {     struct tgsi_src_register   src_register; -   assert( file <= TGSI_FILE_IMMEDIATE ); +   assert( file < TGSI_FILE_COUNT );     assert( swizzle_x <= TGSI_SWIZZLE_W );     assert( swizzle_y <= TGSI_SWIZZLE_W );     assert( swizzle_z <= TGSI_SWIZZLE_W ); @@ -1194,13 +1217,14 @@ struct tgsi_dst_register  tgsi_build_dst_register(     unsigned file,     unsigned mask, +   unsigned indirect,     int index,     struct tgsi_instruction *instruction,     struct tgsi_header *header )  {     struct tgsi_dst_register dst_register; -   assert( file <= TGSI_FILE_IMMEDIATE ); +   assert( file < TGSI_FILE_COUNT );     assert( mask <= TGSI_WRITEMASK_XYZW );     assert( index >= -32768 && index <= 32767 ); @@ -1208,6 +1232,7 @@ tgsi_build_dst_register(     dst_register.File = file;     dst_register.WriteMask = mask;     dst_register.Index = index; +   dst_register.Indirect = indirect;     instruction_grow( instruction, header ); @@ -1220,6 +1245,7 @@ tgsi_default_full_dst_register( void )     struct tgsi_full_dst_register full_dst_register;     full_dst_register.DstRegister = tgsi_default_dst_register(); +   full_dst_register.DstRegisterInd = tgsi_default_src_register();     full_dst_register.DstRegisterExtConcode =        tgsi_default_dst_register_ext_concode();     full_dst_register.DstRegisterExtModulate = diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.h b/src/gallium/auxiliary/tgsi/tgsi_build.h index 0fd6fabd83..9a3a077cf2 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_build.h +++ b/src/gallium/auxiliary/tgsi/tgsi_build.h @@ -289,6 +289,7 @@ struct tgsi_dst_register  tgsi_build_dst_register(     unsigned file,     unsigned mask, +   unsigned indirect,     int index,     struct tgsi_instruction *instruction,     struct tgsi_header *header ); diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c b/src/gallium/auxiliary/tgsi/tgsi_dump.c index 76a09af18e..a6994ecd48 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c @@ -28,6 +28,7 @@  #include "util/u_debug.h"  #include "util/u_string.h"  #include "util/u_math.h" +#include "util/u_memory.h"  #include "tgsi_dump.h"  #include "tgsi_info.h"  #include "tgsi_iterate.h" @@ -108,7 +109,8 @@ static const char *semantic_names[] =     "FOG",     "PSIZE",     "GENERIC", -   "NORMAL" +   "NORMAL", +   "FACE"  };  static const char *immediate_type_names[] = @@ -224,6 +226,9 @@ iter_declaration(  {     struct dump_ctx *ctx = (struct dump_ctx *)iter; +   assert(Elements(semantic_names) == TGSI_SEMANTIC_COUNT); +   assert(Elements(interpolate_names) == TGSI_INTERPOLATE_COUNT); +     TXT( "DCL " );     _dump_register( @@ -355,11 +360,22 @@ iter_instruction(           CHR( ',' );        CHR( ' ' ); -      _dump_register( -         ctx, -         dst->DstRegister.File, -         dst->DstRegister.Index, -         dst->DstRegister.Index ); +      if (dst->DstRegister.Indirect) { +         _dump_register_ind( +            ctx, +            dst->DstRegister.File, +            dst->DstRegister.Index, +            dst->DstRegisterInd.File, +            dst->DstRegisterInd.Index, +            dst->DstRegisterInd.SwizzleX ); +      } +      else { +         _dump_register( +            ctx, +            dst->DstRegister.File, +            dst->DstRegister.Index, +            dst->DstRegister.Index ); +      }        ENM( dst->DstRegisterExtModulate.Modulate, modulate_names );        _dump_writemask( ctx, dst->DstRegister.WriteMask ); diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c b/src/gallium/auxiliary/tgsi/tgsi_exec.c index aba7a3f937..5cb322a5fa 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c @@ -1395,28 +1395,69 @@ store_dest(     union tgsi_exec_channel null;     union tgsi_exec_channel *dst;     uint execmask = mach->ExecMask; +   int offset = 0;  /* indirection offset */ +   int index;  #ifdef DEBUG     check_inf_or_nan(chan);  #endif +   /* There is an extra source register that indirectly subscripts +    * a register file. The direct index now becomes an offset +    * that is being added to the indirect register. +    * +    *    file[ind[2].x+1], +    *    where: +    *       ind = DstRegisterInd.File +    *       [2] = DstRegisterInd.Index +    *       .x = DstRegisterInd.SwizzleX +    */ +   if (reg->DstRegister.Indirect) { +      union tgsi_exec_channel index; +      union tgsi_exec_channel indir_index; +      uint swizzle; + +      /* which address register (always zero for now) */ +      index.i[0] = +      index.i[1] = +      index.i[2] = +      index.i[3] = reg->DstRegisterInd.Index; + +      /* get current value of address register[swizzle] */ +      swizzle = tgsi_util_get_src_register_swizzle( ®->DstRegisterInd, CHAN_X ); + +      /* fetch values from the address/indirection register */ +      fetch_src_file_channel( +         mach, +         reg->DstRegisterInd.File, +         swizzle, +         &index, +         &indir_index ); + +      /* save indirection offset */ +      offset = (int) indir_index.f[0]; +   } +     switch (reg->DstRegister.File) {     case TGSI_FILE_NULL:        dst = &null;        break;     case TGSI_FILE_OUTPUT: -      dst = &mach->Outputs[mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] -                           + reg->DstRegister.Index].xyzw[chan_index]; +      index = mach->Temps[TEMP_OUTPUT_I].xyzw[TEMP_OUTPUT_C].u[0] +         + reg->DstRegister.Index; +      dst = &mach->Outputs[offset + index].xyzw[chan_index];        break;     case TGSI_FILE_TEMPORARY: -      assert( reg->DstRegister.Index < TGSI_EXEC_NUM_TEMPS ); -      dst = &mach->Temps[reg->DstRegister.Index].xyzw[chan_index]; +      index = reg->DstRegister.Index; +      assert( index < TGSI_EXEC_NUM_TEMPS ); +      dst = &mach->Temps[offset + index].xyzw[chan_index];        break;     case TGSI_FILE_ADDRESS: -      dst = &mach->Addrs[reg->DstRegister.Index].xyzw[chan_index]; +      index = reg->DstRegister.Index; +      dst = &mach->Addrs[index].xyzw[chan_index];        break;     default: diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c b/src/gallium/auxiliary/tgsi/tgsi_parse.c index 0081f74ffc..7f2cfb7988 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_parse.c +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c @@ -219,7 +219,6 @@ tgsi_parse_token(           /*            * No support for indirect or multi-dimensional addressing.            */ -         assert( !inst->FullDstRegisters[i].DstRegister.Indirect );           assert( !inst->FullDstRegisters[i].DstRegister.Dimension );           extended = inst->FullDstRegisters[i].DstRegister.Extended; @@ -246,6 +245,17 @@ tgsi_parse_token(              extended = token.Extended;           } + +         if( inst->FullDstRegisters[i].DstRegister.Indirect ) { +            next_token( ctx, &inst->FullDstRegisters[i].DstRegisterInd ); + +            /* +             * No support for indirect or multi-dimensional addressing. +             */ +            assert( !inst->FullDstRegisters[i].DstRegisterInd.Indirect ); +            assert( !inst->FullDstRegisters[i].DstRegisterInd.Dimension ); +            assert( !inst->FullDstRegisters[i].DstRegisterInd.Extended ); +         }        }        assert( inst->Instruction.NumSrcRegs <= TGSI_FULL_MAX_SRC_REGISTERS ); diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h b/src/gallium/auxiliary/tgsi/tgsi_parse.h index 054350712d..a289e26e3a 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_parse.h +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h @@ -48,6 +48,7 @@ struct tgsi_full_header  struct tgsi_full_dst_register  {     struct tgsi_dst_register               DstRegister; +   struct tgsi_src_register               DstRegisterInd;     struct tgsi_dst_register_ext_concode   DstRegisterExtConcode;     struct tgsi_dst_register_ext_modulate  DstRegisterExtModulate;  }; diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c index a40fcab212..a76bbc9140 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_text.c +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c @@ -26,6 +26,7 @@   **************************************************************************/  #include "util/u_debug.h" +#include "util/u_memory.h"  #include "tgsi_text.h"  #include "tgsi_build.h"  #include "tgsi_info.h" @@ -927,7 +928,8 @@ static const char *semantic_names[TGSI_SEMANTIC_COUNT] =     "FOG",     "PSIZE",     "GENERIC", -   "NORMAL" +   "NORMAL", +   "FACE"  };  static const char *interpolate_names[TGSI_INTERPOLATE_COUNT] = @@ -947,6 +949,9 @@ static boolean parse_declaration( struct translate_ctx *ctx )     const char *cur;     uint advance; +   assert(Elements(semantic_names) == TGSI_SEMANTIC_COUNT); +   assert(Elements(interpolate_names) == TGSI_INTERPOLATE_COUNT); +     if (!eat_white( &ctx->cur )) {        report_error( ctx, "Syntax error" );        return FALSE; diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c index 123e63f655..edf422c1bd 100644 --- a/src/mesa/drivers/dri/intel/intel_context.c +++ b/src/mesa/drivers/dri/intel/intel_context.c @@ -67,7 +67,7 @@ int INTEL_DEBUG = (0);  #endif -#define DRIVER_DATE                     "20090114" +#define DRIVER_DATE                     "20090712 2009Q2 RC3"  #define DRIVER_DATE_GEM                 "GEM " DRIVER_DATE diff --git a/src/mesa/drivers/dri/r128/r128_state.c b/src/mesa/drivers/dri/r128/r128_state.c index 451dcd1b55..4ae7bf5b97 100644 --- a/src/mesa/drivers/dri/r128/r128_state.c +++ b/src/mesa/drivers/dri/r128/r128_state.c @@ -771,6 +771,11 @@ static void r128DDLightModelfv( GLcontext *ctx, GLenum pname,        FLUSH_BATCH( rmesa );        updateSpecularLighting(ctx);     } + +   if ( pname == GL_LIGHT_MODEL_TWO_SIDE ) { +      FLUSH_BATCH( rmesa ); +      r128ChooseRenderState( ctx ); +   }  }  static void r128DDShadeModel( GLcontext *ctx, GLenum mode ) diff --git a/src/mesa/drivers/dri/r128/r128_tris.c b/src/mesa/drivers/dri/r128/r128_tris.c index bcc9ffa651..5b91271d74 100644 --- a/src/mesa/drivers/dri/r128/r128_tris.c +++ b/src/mesa/drivers/dri/r128/r128_tris.c @@ -426,7 +426,7 @@ r128_fallback_point( r128ContextPtr rmesa,  #define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE|DD_TRI_OFFSET|DD_TRI_UNFILLED)  #define _R128_NEW_RENDER_STATE (ANY_FALLBACK_FLAGS | ANY_RASTER_FLAGS) -static void r128ChooseRenderState(GLcontext *ctx) +void r128ChooseRenderState(GLcontext *ctx)  {     r128ContextPtr rmesa = R128_CONTEXT(ctx);     GLuint flags = ctx->_TriangleCaps; diff --git a/src/mesa/drivers/dri/r128/r128_tris.h b/src/mesa/drivers/dri/r128/r128_tris.h index d90ca31534..c0667edb61 100644 --- a/src/mesa/drivers/dri/r128/r128_tris.h +++ b/src/mesa/drivers/dri/r128/r128_tris.h @@ -38,7 +38,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.  #include "main/mtypes.h"  extern void r128InitTriFuncs( GLcontext *ctx ); - +extern void r128ChooseRenderState( GLcontext *ctx );  extern void r128Fallback( GLcontext *ctx, GLuint bit, GLboolean mode );  #define FALLBACK( rmesa, bit, mode ) r128Fallback( rmesa->glCtx, bit, mode ) diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c index 5219119c81..8b3bb5cc03 100644 --- a/src/mesa/state_tracker/st_atom_shader.c +++ b/src/mesa/state_tracker/st_atom_shader.c @@ -139,7 +139,7 @@ find_translated_vp(struct st_context *st,           if (fragInputsRead & (1 << inAttr)) {              stfp->input_to_slot[inAttr] = numIn;              numIn++; -            if ((fragInputsRead & FRAG_BIT_FOGC)) { +            if (((1 << inAttr) & FRAG_BIT_FOGC)) {                 /* leave placeholders for the                  * extra registers we extract from fog */                 if (stfp->Base.UsesFrontFacing) { diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c index 8aef3fc6dc..e150dff9bb 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c @@ -268,6 +268,11 @@ compile_instruction(        NULL,        GL_FALSE );     fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask ); +   if (inst->DstReg.RelAddr) { +      fulldst->DstRegister.Indirect = 1; +      fulldst->DstRegisterInd.File = TGSI_FILE_ADDRESS; +      fulldst->DstRegisterInd.Index = 0; +   }     for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {        GLuint j; diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index f8e46ff9c9..d00d304d2e 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -1144,6 +1144,11 @@ static void vbo_destroy_vertex_list( GLcontext *ctx, void *data )     if ( --node->prim_store->refcount == 0 )        FREE( node->prim_store ); + +   if (node->current_data) { +      FREE(node->current_data); +      node->current_data = NULL; +   }  } | 
