r600g: add cb support for snorm formats.
authorDave Airlie <airlied@redhat.com>
Tue, 19 Apr 2011 10:42:48 +0000 (20:42 +1000)
committerDave Airlie <airlied@redhat.com>
Tue, 19 Apr 2011 10:44:13 +0000 (20:44 +1000)
Check for signed type and enable SNORM.

Signed-off-by: Dave Airlie <airlied@redhat.com>
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_state.c

index cff79fa..6aa22d9 100644 (file)
@@ -680,10 +680,17 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state
                                         level, state->cbufs[cb]->u.tex.first_layer);
        pitch = rtex->pitch_in_blocks[level] / 8 - 1;
        slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64 - 1;
-       ntype = V_028C70_NUMBER_UNORM;
        desc = util_format_description(surf->base.format);
+       for (i = 0; i < 4; i++) {
+               if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
+                       break;
+               }
+       }
+       ntype = V_028C70_NUMBER_UNORM;
        if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
                ntype = V_028C70_NUMBER_SRGB;
+       else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED)
+               ntype = V_028C70_NUMBER_SNORM;
 
        format = r600_translate_colorformat(surf->base.format);
        swap = r600_translate_colorswap(surf->base.format);
@@ -698,11 +705,6 @@ static void evergreen_cb(struct r600_pipe_context *rctx, struct r600_pipe_state
                S_028C70_BLEND_CLAMP(1) |
                S_028C70_NUMBER_TYPE(ntype);
 
-       for (i = 0; i < 4; i++) {
-               if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
-                       break;
-               }
-       }
 
        /* we can only set the export size if any thing is snorm/unorm component is > 11 bits,
           if we aren't a float, sint or uint */
index 3a863ae..eba48f8 100644 (file)
@@ -742,16 +742,18 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
                                         level, state->cbufs[cb]->u.tex.first_layer);
        pitch = rtex->pitch_in_blocks[level] / 8 - 1;
        slice = rtex->pitch_in_blocks[level] * surf->aligned_height / 64 - 1;
-       ntype = V_0280A0_NUMBER_UNORM;
        desc = util_format_description(surf->base.format);
-       if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
-               ntype = V_0280A0_NUMBER_SRGB;
 
        for (i = 0; i < 4; i++) {
                if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
                        break;
                }
        }
+       ntype = V_0280A0_NUMBER_UNORM;
+       if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
+               ntype = V_0280A0_NUMBER_SRGB;
+       else if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED)
+               ntype = V_0280A0_NUMBER_SNORM;
 
        format = r600_translate_colorformat(surf->base.format);
        swap = r600_translate_colorswap(surf->base.format);