FP textures and fixes (Ewald Snel)
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 29 Mar 2006 15:21:01 +0000 (15:21 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 29 Mar 2006 15:21:01 +0000 (15:21 +0000)
src/mesa/drivers/dri/r300/r300_context.c
src/mesa/drivers/dri/r300/r300_context.h
src/mesa/drivers/dri/r300/r300_fragprog.c
src/mesa/drivers/dri/r300/r300_tex.c
src/mesa/drivers/dri/r300/r300_texmem.c
src/mesa/drivers/dri/r300/r300_texstate.c

index 69a3270..4943d54 100644 (file)
@@ -116,6 +116,7 @@ const struct dri_extension card_extensions[] = {
   {"GL_ATI_texture_mirror_once",       NULL},
   {"GL_MESA_pack_invert",              NULL},
   {"GL_MESA_ycbcr_texture",            NULL},
+  {"GL_MESAX_texture_float",           NULL},
   {"GL_NV_blend_square",               NULL},
   {"GL_NV_vertex_program",             GL_NV_vertex_program_functions},
   {"GL_SGIS_generate_mipmap",          NULL},
index bce4950..176341d 100644 (file)
@@ -615,7 +615,7 @@ struct r300_vertex_program {
 #define PFS_MAX_TEX_INST       64
 #define PFS_MAX_TEX_INDIRECT 4
 #define PFS_NUM_TEMP_REGS      32
-#define PFS_NUM_CONST_REGS     32
+#define PFS_NUM_CONST_REGS     16
 
 /* Tracking data for Mesa registers */
 struct reg_acc {
index c784519..db50905 100644 (file)
@@ -886,7 +886,7 @@ static void emit_arith(struct r300_fragment_program *rp, int op,
        sop = r300_fpop[op].s_op;
        argc = r300_fpop[op].argc;      
 
-       if (mask & WRITEMASK_XYZ)
+       if ((mask & WRITEMASK_XYZ) || vop == R300_FPI0_OUTC_DP3)
                emit_vop = GL_TRUE;
        if ((mask & WRITEMASK_W) || vop == R300_FPI0_OUTC_REPL_ALPHA)
                emit_sop = GL_TRUE;
index 7aa3027..efa072c 100644 (file)
@@ -442,6 +442,31 @@ static const struct gl_texture_format *r300ChooseTextureFormat(GLcontext * ctx,
        case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
          return &_mesa_texformat_rgba_dxt5;
          
+       case GL_ALPHA16F_ARB:
+         return &_mesa_texformat_alpha_float16;
+       case GL_ALPHA32F_ARB:
+         return &_mesa_texformat_alpha_float32;
+       case GL_LUMINANCE16F_ARB:
+         return &_mesa_texformat_luminance_float16;
+       case GL_LUMINANCE32F_ARB:
+         return &_mesa_texformat_luminance_float32;
+       case GL_LUMINANCE_ALPHA16F_ARB:
+         return &_mesa_texformat_luminance_alpha_float16;
+       case GL_LUMINANCE_ALPHA32F_ARB:
+         return &_mesa_texformat_luminance_alpha_float32;
+       case GL_INTENSITY16F_ARB:
+         return &_mesa_texformat_intensity_float16;
+       case GL_INTENSITY32F_ARB:
+         return &_mesa_texformat_intensity_float32;
+       case GL_RGB16F_ARB:
+         return &_mesa_texformat_rgba_float16;
+       case GL_RGB32F_ARB:
+         return &_mesa_texformat_rgba_float32;
+       case GL_RGBA16F_ARB:
+         return &_mesa_texformat_rgba_float16;
+       case GL_RGBA32F_ARB:
+         return &_mesa_texformat_rgba_float32;
+
        default:
                _mesa_problem(ctx,
                              "unexpected internalFormat 0x%x in r300ChooseTextureFormat",
index 90d8b2f..a9f64b4 100644 (file)
@@ -382,7 +382,17 @@ static void uploadSubImage( r300ContextPtr rmesa, r300TexObjPtr t,
    /* copy (x,y,width,height,data) */
    memcpy( &tmp, &t->image[face][hwlevel], sizeof(tmp) );
    
-   if (texImage->TexFormat->TexelBytes) {
+   if (texImage->TexFormat->TexelBytes > 4) {
+      const int log2TexelBytes = (3 + (texImage->TexFormat->TexelBytes >> 4));
+      tex.format = RADEON_TXFORMAT_I8; /* any 1-byte texel format */
+      tex.pitch = MAX2((texImage->Width * texImage->TexFormat->TexelBytes) / 64, 1);
+      tex.height = imageHeight;
+      tex.width = imageWidth << log2TexelBytes;
+      tex.offset += (tmp.x << log2TexelBytes) & ~1023;
+      tmp.x = tmp.x % (1024 >> log2TexelBytes);
+      tmp.width = tmp.width << log2TexelBytes;
+   }
+   else if (texImage->TexFormat->TexelBytes) {
       /* use multi-byte upload scheme */
       tex.height = imageHeight;
       tex.width = imageWidth;
index ee2515c..370a177 100644 (file)
@@ -69,7 +69,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     [ MESA_FORMAT_ ## f ] = { R200_TXFORMAT_ ## f, R200_YUV_TO_RGB }
 #define _INVALID(f) \
     [ MESA_FORMAT_ ## f ] = { 0xffffffff, 0 }
-#define VALID_FORMAT(f) ( ((f) <= MESA_FORMAT_RGBA_DXT5) \
+#define VALID_FORMAT(f) ( ((f) <= MESA_FORMAT_RGBA_DXT5 \
+       || ((f) >= MESA_FORMAT_RGBA_FLOAT32 && (f) <= MESA_FORMAT_INTENSITY_FLOAT16)) \
                             && tx_table[f].flag )
 
 #define _ASSIGN(entry, format) \
@@ -141,6 +142,18 @@ static const struct {
            _ASSIGN(RGBA_DXT1, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT1)),
            _ASSIGN(RGBA_DXT3, R300_EASY_TX_FORMAT(X, Y, Z, W, DXT3)),
            _ASSIGN(RGBA_DXT5, R300_EASY_TX_FORMAT(Y, Z, W, X, DXT5)),
+           _ASSIGN(RGBA_FLOAT32, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R32G32B32A32)),
+           _ASSIGN(RGBA_FLOAT16, R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16)),
+           _ASSIGN(RGB_FLOAT32, 0xffffffff),
+           _ASSIGN(RGB_FLOAT16, 0xffffffff),
+           _ASSIGN(ALPHA_FLOAT32, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I32)),
+           _ASSIGN(ALPHA_FLOAT16, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, FL_I16)),
+           _ASSIGN(LUMINANCE_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I32)),
+           _ASSIGN(LUMINANCE_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, ONE, FL_I16)),
+           _ASSIGN(LUMINANCE_ALPHA_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I32A32)),
+           _ASSIGN(LUMINANCE_ALPHA_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, Y, FL_I16A16)),
+           _ASSIGN(INTENSITY_FLOAT32, R300_EASY_TX_FORMAT(X, X, X, X, FL_I32)),
+           _ASSIGN(INTENSITY_FLOAT16, R300_EASY_TX_FORMAT(X, X, X, X, FL_I16)),
            };
 
 #undef _COLOR