diff options
| author | José Fonseca <jrfonseca@tungstengraphics.com> | 2008-09-19 23:49:33 +0900 | 
|---|---|---|
| committer | José Fonseca <jrfonseca@tungstengraphics.com> | 2008-09-19 23:49:33 +0900 | 
| commit | d310c52c7f6dd586673e848712f5977a03ff1438 (patch) | |
| tree | 386ec4753a19b3da9e743d700a505465ab2d98a0 | |
| parent | dda5c0c611d55449a7079c9efeaccc417552c5db (diff) | |
| parent | 13e7e4b634a94efe14f4d79723844d5fdfe12ad4 (diff) | |
Merge branch 'gallium-0.2' of ssh+git://git.freedesktop.org/git/mesa/mesa into gallium-0.2
| -rw-r--r-- | src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c | 23 | ||||
| -rw-r--r-- | src/gallium/auxiliary/rtasm/rtasm_ppc_spe.h | 4 | ||||
| -rw-r--r-- | src/gallium/drivers/cell/ppu/cell_gen_fragment.c | 143 | ||||
| -rw-r--r-- | src/gallium/winsys/drm/intel/dri/intel_screen.c | 11 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/common/utils.c | 119 | ||||
| -rw-r--r-- | src/mesa/drivers/dri/common/utils.h | 5 | ||||
| -rw-r--r-- | src/mesa/main/context.c | 2 | 
7 files changed, 233 insertions, 74 deletions
| diff --git a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c index 12e0826fb9..f60bfba3f5 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c +++ b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c @@ -592,11 +592,32 @@ spe_load_int(struct spe_function *p, unsigned rT, int i)     }  } +void spe_load_uint(struct spe_function *p, unsigned rT, unsigned int ui) +{ +   /* If the whole value is in the lower 18 bits, use ila, which +    * doesn't sign-extend.  Otherwise, if the two halfwords of +    * the constant are identical, use ilh.  Otherwise, we have +    * to use ilhu followed by iohl. +    */ +   if ((ui & 0xfffc0000) == ui) { +      spe_ila(p, rT, ui); +   } +   else if ((ui >> 16) == (ui & 0xffff)) { +      spe_ilh(p, rT, ui & 0xffff); +   } +   else { +      spe_ilhu(p, rT, ui >> 16); +      if (ui & 0xffff) +         spe_iohl(p, rT, ui & 0xffff); +   } +} +  void  spe_splat(struct spe_function *p, unsigned rT, unsigned rA)  { -   spe_ila(p, rT, 66051); +   /* Duplicate bytes 0, 1, 2, and 3 across the whole register */ +   spe_ila(p, rT, 0x00010203);     spe_shufb(p, rT, rA, rA, rT);  } diff --git a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.h b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.h index 4ef05ea27d..09400b3fb2 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.h +++ b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.h @@ -302,6 +302,10 @@ spe_load_float(struct spe_function *p, unsigned rT, float x);  extern void  spe_load_int(struct spe_function *p, unsigned rT, int i); +/** Load/splat immediate unsigned int into rT. */ +extern void +spe_load_uint(struct spe_function *p, unsigned rT, unsigned int ui); +  /** Replicate word 0 of rA across rT. */  extern void  spe_splat(struct spe_function *p, unsigned rT, unsigned rA); diff --git a/src/gallium/drivers/cell/ppu/cell_gen_fragment.c b/src/gallium/drivers/cell/ppu/cell_gen_fragment.c index 9d25e820ad..899d8423b2 100644 --- a/src/gallium/drivers/cell/ppu/cell_gen_fragment.c +++ b/src/gallium/drivers/cell/ppu/cell_gen_fragment.c @@ -902,8 +902,69 @@ gen_logicop(const struct pipe_blend_state *blend,              struct spe_function *f,              int fragRGBA_reg, int fbRGBA_reg)  { -   /* XXX to-do */ -   /* operate on 32-bit packed pixels, not float colors */ +   /* We've got four 32-bit RGBA packed pixels in each of +    * fragRGBA_reg and fbRGBA_reg, not sets of floating-point +    * reds, greens, blues, and alphas. +    * */ +   ASSERT(blend->logicop_enable); + +   switch(blend->logicop_func) { +      case PIPE_LOGICOP_CLEAR: /* 0 */ +         spe_zero(f, fragRGBA_reg); +         break; +      case PIPE_LOGICOP_NOR: /* ~(s | d) */ +         spe_nor(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_AND_INVERTED: /* ~s & d */ +         /* andc R, A, B computes R = A & ~B */ +         spe_andc(f, fragRGBA_reg, fbRGBA_reg, fragRGBA_reg); +         break; +      case PIPE_LOGICOP_COPY_INVERTED: /* ~s */ +         spe_complement(f, fragRGBA_reg); +         break; +      case PIPE_LOGICOP_AND_REVERSE: /* s & ~d */ +         /* andc R, A, B computes R = A & ~B */ +         spe_andc(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_INVERT: /* ~d */ +         /* Note that (A nor A) == ~(A|A) == ~A */ +         spe_nor(f, fragRGBA_reg, fbRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_XOR: /* s ^ d */ +         spe_xor(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_NAND: /* ~(s & d) */ +         spe_nand(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_AND: /* s & d */ +         spe_and(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_EQUIV: /* ~(s ^ d) */ +         spe_xor(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         spe_complement(f, fragRGBA_reg); +         break; +      case PIPE_LOGICOP_NOOP: /* d */ +         spe_move(f, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_OR_INVERTED: /* ~s | d */ +         /* orc R, A, B computes R = A | ~B */ +         spe_orc(f, fragRGBA_reg, fbRGBA_reg, fragRGBA_reg); +         break; +      case PIPE_LOGICOP_COPY: /* s */ +         break; +      case PIPE_LOGICOP_OR_REVERSE: /* s | ~d */ +         /* orc R, A, B computes R = A | ~B */ +         spe_orc(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_OR: /* s | d */ +         spe_or(f, fragRGBA_reg, fragRGBA_reg, fbRGBA_reg); +         break; +      case PIPE_LOGICOP_SET: /* 1 */ +         spe_load_int(f, fragRGBA_reg, 0xffffffff); +         break; +      default: +         ASSERT(0); +   }  } @@ -912,11 +973,81 @@ gen_colormask(uint colormask,                struct spe_function *f,                int fragRGBA_reg, int fbRGBA_reg)  { -   /* XXX to-do */ -   /* operate on 32-bit packed pixels, not float colors */ -} +   /* We've got four 32-bit RGBA packed pixels in each of +    * fragRGBA_reg and fbRGBA_reg, not sets of floating-point +    * reds, greens, blues, and alphas. +    * */ +   /* The color mask operation can prevent any set of color +    * components in the incoming fragment from being written to the frame  +    * buffer; we do this by replacing the masked components of the  +    * fragment with the frame buffer values. +    * +    * There are only 16 possibilities, with a unique mask for +    * each of the possibilities.  (Technically, there are only 15 +    * possibilities, since we shouldn't be called for the one mask +    * that does nothing, but the complete implementation is here +    * anyway to avoid confusion.) +    * +    * We implement this via a constant static array which we'll index  +    * into to get the correct mask. +    *  +    * We're dependent on the mask values being low-order bits, +    * with particular values for each bit; so we start with a +    * few assertions, which will fail if any of the values were +    * to change. +    */ +   ASSERT(PIPE_MASK_R == 0x1); +   ASSERT(PIPE_MASK_G == 0x2); +   ASSERT(PIPE_MASK_B == 0x4); +   ASSERT(PIPE_MASK_A == 0x8); +   /* Here's the list of all possible colormasks, indexed by the +    * value of the combined mask specifier. +    */ +   static const unsigned int colormasks[16] = { +      0x00000000, /* 0: all colors masked */ +      0xff000000, /* 1: PIPE_MASK_R */ +      0x00ff0000, /* 2: PIPE_MASK_G */ +      0xffff0000, /* 3: PIPE_MASK_R | PIPE_MASK_G */ +      0x0000ff00, /* 4: PIPE_MASK_B */ +      0xff00ff00, /* 5: PIPE_MASK_R | PIPE_MASK_B */ +      0x00ffff00, /* 6: PIPE_MASK_G | PIPE_MASK_B */ +      0xffffff00, /* 7: PIPE_MASK_R | PIPE_MASK_G | PIPE_MASK_B */ +      0x000000ff, /* 8: PIPE_MASK_A */ +      0xff0000ff, /* 9: PIPE_MASK_R | PIPE_MASK_A */ +      0x00ff00ff, /* 10: PIPE_MASK_G | PIPE_MASK_A */ +      0xffff00ff, /* 11: PIPE_MASK_R | PIPE_MASK_G | PIPE_MASK_A */ +      0x0000ffff, /* 12: PIPE_MASK_B | PIPE_MASK_A */ +      0xff00ffff, /* 13: PIPE_MASK_R | PIPE_MASK_B | PIPE_MASK_A */ +      0x00ffffff, /* 14: PIPE_MASK_G | PIPE_MASK_B | PIPE_MASK_A */ +      0xffffffff  /* 15: PIPE_MASK_R | PIPE_MASK_G | PIPE_MASK_B | PIPE_MASK_A */ +   }; + +   /* Get a temporary register to hold the mask */ +   int colormask_reg = spe_allocate_available_register(f); + +   /* Look up the desired mask directly and load it into the mask register. +    * This will load the same mask into each of the four words in the +    * mask register. +    */ +   spe_load_uint(f, colormask_reg, colormasks[colormask]); + +   /* Use the mask register to select between the fragment color +    * values and the frame buffer color values.  Wherever the +    * mask has a 0 bit, the current frame buffer color should override +    * the fragment color.  Wherever the mask has a 1 bit, the  +    * fragment color should persevere.  The Select Bits (selb rt, rA, rB, rM) +    * instruction will select bits from its first operand rA wherever the +    * the mask bits rM are 0, and from its second operand rB wherever the +    * mask bits rM are 1.  That means that the frame buffer color is the +    * first operand, and the fragment color the second. +    */ +    spe_selb(f, fragRGBA_reg, fbRGBA_reg, fragRGBA_reg, colormask_reg); + +    /* Release the temporary register and we're done */ +    spe_release_register(f, colormask_reg); +}  /**   * Generate code to pack a quad of float colors into a four 32-bit integers. @@ -1223,7 +1354,7 @@ cell_gen_fragment_function(struct cell_context *cell, struct spe_function *f)           gen_logicop(blend, f, rgba_reg, fbRGBA_reg);        } -      if (blend->colormask != 0xf) { +      if (blend->colormask != PIPE_MASK_RGBA) {           gen_colormask(blend->colormask, f, rgba_reg, fbRGBA_reg);        } diff --git a/src/gallium/winsys/drm/intel/dri/intel_screen.c b/src/gallium/winsys/drm/intel/dri/intel_screen.c index 3465f8a4d9..78b9a6db05 100644 --- a/src/gallium/winsys/drm/intel/dri/intel_screen.c +++ b/src/gallium/winsys/drm/intel/dri/intel_screen.c @@ -365,12 +365,10 @@ intel_flush_frontbuffer( struct pipe_winsys *winsys,                           struct pipe_surface *surf,                           void *context_private)  { -   //struct intel_context *intel = (struct intel_context *) context_private; -   //__DRIdrawablePrivate *dPriv = intel->driDrawable; +   struct intel_context *intel = (struct intel_context *) context_private; +   __DRIdrawablePrivate *dPriv = intel->driDrawable; -   //assert((int)"Doesn't work currently" & 0); - -   //intelDisplaySurface(dPriv, surf, NULL); +   intelDisplaySurface(dPriv, surf, NULL);  }  static boolean @@ -565,7 +563,7 @@ intelFillInModes(__DRIscreenPrivate *psp,     configs = driCreateConfigs(fb_format, fb_type,  			      depth_bits_array, stencil_bits_array,  			      depth_buffer_factor, back_buffer_modes, -			      back_buffer_factor); +			      back_buffer_factor, msaa_samples_array, 1);     if (configs == NULL) {      fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__,                __LINE__); @@ -619,6 +617,7 @@ static const __DRIconfig **intelInitScreen(__DRIscreenPrivate *psp)      *      * Hello chicken.  Hello egg.  How are you two today?      */ +   driInitExtensions( NULL, card_extensions, GL_FALSE );     //intelInitExtensions(NULL, GL_TRUE);     if (!intelInitDriver(psp)) diff --git a/src/mesa/drivers/dri/common/utils.c b/src/mesa/drivers/dri/common/utils.c index 431c26a19d..f2e0f03641 100644 --- a/src/mesa/drivers/dri/common/utils.c +++ b/src/mesa/drivers/dri/common/utils.c @@ -524,15 +524,12 @@ GLboolean driClipRectToFramebuffer( const GLframebuffer *buffer,   * \c GL_UNSIGNED_3BYTE_8_8_8, \c GL_4FLOAT_32_32_32_32,    * \c GL_4HALF_16_16_16_16, etc.  We can cross that bridge when we come to it.   */ - -/* XXX: need to re-add msaa support after gallium-0.1 merge - */ -  __DRIconfig **  driCreateConfigs(GLenum fb_format, GLenum fb_type,  		 const u_int8_t * depth_bits, const u_int8_t * stencil_bits,  		 unsigned num_depth_stencil_bits, -		 const GLenum * db_modes, unsigned num_db_modes) +		 const GLenum * db_modes, unsigned num_db_modes, +	 	 const u_int8_t * msaa_samples, unsigned num_msaa_modes)  {     static const u_int8_t bits_table[4][4] = {       /* R  G  B  A */ @@ -592,9 +589,7 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,     int index;     __DRIconfig **configs, **c;     __GLcontextModes *modes; -   unsigned i; -   unsigned j; -   unsigned k; +   unsigned i, j, k, h;     unsigned num_modes;     unsigned num_accum_bits = 2; @@ -667,7 +662,7 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,  	 break;     } -   num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits; +   num_modes = num_depth_stencil_bits * num_db_modes * num_accum_bits * num_msaa_modes;     configs = _mesa_calloc((num_modes + 1) * sizeof *configs);     if (configs == NULL)         return NULL; @@ -675,66 +670,72 @@ driCreateConfigs(GLenum fb_format, GLenum fb_type,      c = configs;      for ( k = 0 ; k < num_depth_stencil_bits ; k++ ) {  	for ( i = 0 ; i < num_db_modes ; i++ ) { -	    for ( j = 0 ; j < num_accum_bits ; j++ ) { -		*c = _mesa_malloc (sizeof **c); -		modes = &(*c)->modes; -		c++; +	    for ( h = 0 ; h < num_msaa_modes; h++ ) { +	    	for ( j = 0 ; j < num_accum_bits ; j++ ) { +		    *c = _mesa_malloc (sizeof **c); +		    modes = &(*c)->modes; +		    c++; -		memset(modes, 0, sizeof *modes); -		modes->redBits   = bits[0]; -		modes->greenBits = bits[1]; -		modes->blueBits  = bits[2]; -		modes->alphaBits = bits[3]; -		modes->redMask   = masks[0]; -		modes->greenMask = masks[1]; -		modes->blueMask  = masks[2]; -		modes->alphaMask = masks[3]; -		modes->rgbBits   = modes->redBits + modes->greenBits -		    + modes->blueBits + modes->alphaBits; +		    memset(modes, 0, sizeof *modes); +		    modes->redBits   = bits[0]; +		    modes->greenBits = bits[1]; +		    modes->blueBits  = bits[2]; +		    modes->alphaBits = bits[3]; +		    modes->redMask   = masks[0]; +		    modes->greenMask = masks[1]; +		    modes->blueMask  = masks[2]; +		    modes->alphaMask = masks[3]; +		    modes->rgbBits   = modes->redBits + modes->greenBits +		    	+ modes->blueBits + modes->alphaBits; -		modes->accumRedBits   = 16 * j; -		modes->accumGreenBits = 16 * j; -		modes->accumBlueBits  = 16 * j; -		modes->accumAlphaBits = (masks[3] != 0) ? 16 * j : 0; -		modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG; +		    modes->accumRedBits   = 16 * j; +		    modes->accumGreenBits = 16 * j; +		    modes->accumBlueBits  = 16 * j; +		    modes->accumAlphaBits = (masks[3] != 0) ? 16 * j : 0; +		    modes->visualRating = (j == 0) ? GLX_NONE : GLX_SLOW_CONFIG; -		modes->stencilBits = stencil_bits[k]; -		modes->depthBits = depth_bits[k]; +		    modes->stencilBits = stencil_bits[k]; +		    modes->depthBits = depth_bits[k]; -		modes->transparentPixel = GLX_NONE; -		modes->transparentRed = GLX_DONT_CARE; -		modes->transparentGreen = GLX_DONT_CARE; -		modes->transparentBlue = GLX_DONT_CARE; -		modes->transparentAlpha = GLX_DONT_CARE; -		modes->transparentIndex = GLX_DONT_CARE; -		modes->visualType = GLX_DONT_CARE; -		modes->renderType = GLX_RGBA_BIT; -		modes->drawableType = GLX_WINDOW_BIT; -		modes->rgbMode = GL_TRUE; +		    modes->transparentPixel = GLX_NONE; +		    modes->transparentRed = GLX_DONT_CARE; +		    modes->transparentGreen = GLX_DONT_CARE; +		    modes->transparentBlue = GLX_DONT_CARE; +		    modes->transparentAlpha = GLX_DONT_CARE; +		    modes->transparentIndex = GLX_DONT_CARE; +		    modes->visualType = GLX_DONT_CARE; +		    modes->renderType = GLX_RGBA_BIT; +		    modes->drawableType = GLX_WINDOW_BIT; +		    modes->rgbMode = GL_TRUE; -		if ( db_modes[i] == GLX_NONE ) { -		    modes->doubleBufferMode = GL_FALSE; -		} -		else { -		    modes->doubleBufferMode = GL_TRUE; -		    modes->swapMethod = db_modes[i]; -		} +		    if ( db_modes[i] == GLX_NONE ) { +		    	modes->doubleBufferMode = GL_FALSE; +		    } +		    else { +		    	modes->doubleBufferMode = GL_TRUE; +		    	modes->swapMethod = db_modes[i]; +		    } + +		    modes->samples = msaa_samples[h]; +		    modes->sampleBuffers = modes->samples ? 1 : 0; -		modes->haveAccumBuffer = ((modes->accumRedBits + + +		    modes->haveAccumBuffer = ((modes->accumRedBits +  					   modes->accumGreenBits +  					   modes->accumBlueBits +  					   modes->accumAlphaBits) > 0); -		modes->haveDepthBuffer = (modes->depthBits > 0); -		modes->haveStencilBuffer = (modes->stencilBits > 0); +		    modes->haveDepthBuffer = (modes->depthBits > 0); +		    modes->haveStencilBuffer = (modes->stencilBits > 0); -		modes->bindToTextureRgb = GL_TRUE; -		modes->bindToTextureRgba = GL_TRUE; -		modes->bindToMipmapTexture = GL_FALSE; -		modes->bindToTextureTargets = modes->rgbMode ? -		    __DRI_ATTRIB_TEXTURE_1D_BIT | -		    __DRI_ATTRIB_TEXTURE_2D_BIT | -		    __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT : -		    0; +		    modes->bindToTextureRgb = GL_TRUE; +		    modes->bindToTextureRgba = GL_TRUE; +		    modes->bindToMipmapTexture = GL_FALSE; +		    modes->bindToTextureTargets = modes->rgbMode ? +		    	__DRI_ATTRIB_TEXTURE_1D_BIT | +		    	__DRI_ATTRIB_TEXTURE_2D_BIT | +		    	__DRI_ATTRIB_TEXTURE_RECTANGLE_BIT : +		    	0; +		}  	    }  	}      } diff --git a/src/mesa/drivers/dri/common/utils.h b/src/mesa/drivers/dri/common/utils.h index 9ac3b51447..32a420060d 100644 --- a/src/mesa/drivers/dri/common/utils.h +++ b/src/mesa/drivers/dri/common/utils.h @@ -129,9 +129,10 @@ struct __DRIconfigRec {  extern __DRIconfig **  driCreateConfigs(GLenum fb_format, GLenum fb_type, -		 const u_int8_t * depth_bits, const u_int8_t * stencil_bits, +		 const uint8_t * depth_bits, const uint8_t * stencil_bits,  		 unsigned num_depth_stencil_bits, -		 const GLenum * db_modes, unsigned num_db_modes); +		 const GLenum * db_modes, unsigned num_db_modes, +    		 const uint8_t * msaa_samples, unsigned num_msaa_modes);  const __DRIconfig **driConcatConfigs(__DRIconfig **a, __DRIconfig **b); diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 96a8c30106..564139a865 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1316,7 +1316,9 @@ _mesa_free_context_data( GLcontext *ctx )     _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._Current, NULL);     _mesa_reference_fragprog(ctx, &ctx->FragmentProgram._TexEnvProgram, NULL); +#if FEATURE_attrib_stack     _mesa_free_attrib_data(ctx); +#endif     _mesa_free_lighting_data( ctx );  #if FEATURE_evaluators     _mesa_free_eval_data( ctx ); | 
