r600g: fix eg/cayman scissor workaround
[mesa.git] / src / gallium / drivers / r600 / r600_state.c
index 90c5ba2b31e7b7c179e1b404cd0f70e156c28b5f..21e6abcb1f6e34923d8dfbc2027d6803ccd0a8c7 100644 (file)
@@ -369,6 +369,7 @@ static void *r600_create_sampler_state(struct pipe_context *ctx,
 {
        struct r600_pipe_state *rstate = CALLOC_STRUCT(r600_pipe_state);
        union util_color uc;
+       unsigned aniso_flag_offset = state->max_anisotropy > 1 ? 4 : 0;
 
        if (rstate == NULL) {
                return NULL;
@@ -380,9 +381,10 @@ static void *r600_create_sampler_state(struct pipe_context *ctx,
                        S_03C000_CLAMP_X(r600_tex_wrap(state->wrap_s)) |
                        S_03C000_CLAMP_Y(r600_tex_wrap(state->wrap_t)) |
                        S_03C000_CLAMP_Z(r600_tex_wrap(state->wrap_r)) |
-                       S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter)) |
-                       S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter)) |
+                       S_03C000_XY_MAG_FILTER(r600_tex_filter(state->mag_img_filter) | aniso_flag_offset) |
+                       S_03C000_XY_MIN_FILTER(r600_tex_filter(state->min_img_filter) | aniso_flag_offset) |
                        S_03C000_MIP_FILTER(r600_tex_mipfilter(state->min_mip_filter)) |
+                       S_03C000_MAX_ANISO(r600_tex_aniso_filter(state->max_anisotropy)) |
                        S_03C000_DEPTH_COMPARE_FUNCTION(r600_tex_compare(state->compare_func)) |
                        S_03C000_BORDER_COLOR_TYPE(uc.ui ? V_03C000_SQ_TEX_BORDER_COLOR_REGISTER : 0), 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_03C004_SQ_TEX_SAMPLER_WORD1_0,
@@ -483,7 +485,7 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
                                (tmp->offset[1] + r600_bo_offset(bo[1])) >> 8, 0xFFFFFFFF, bo[1]);
        r600_pipe_state_add_reg(rstate, R_038010_RESOURCE0_WORD4,
                                word4 |
-                               S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_NO_ZERO) |
+                               S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_ZERO_CLAMP_MINUS_ONE) |
                                S_038010_REQUEST_SIZE(1) |
                                S_038010_ENDIAN_SWAP(endian) |
                                S_038010_BASE_LEVEL(state->u.tex.first_level), 0xFFFFFFFF, NULL);
@@ -492,7 +494,8 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
                                S_038014_BASE_ARRAY(state->u.tex.first_layer) |
                                S_038014_LAST_ARRAY(state->u.tex.last_layer), 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6,
-                               S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE), 0xFFFFFFFF, NULL);
+                               S_038018_TYPE(V_038010_SQ_TEX_VTX_VALID_TEXTURE) |
+                               S_038018_MAX_ANISO(4 /* max 16 samples */), 0xFFFFFFFF, NULL);
 
        return &resource->base;
 }
@@ -770,11 +773,36 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
                S_0280A0_NUMBER_TYPE(ntype) |
                S_0280A0_ENDIAN(endian);
 
-       /* on R600 this can't be set if BLEND_CLAMP isn't set,
-          if BLEND_FLOAT32 is set of > 11 bits in a UNORM or SNORM */
-       if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
-           desc->channel[i].size < 12)
-               color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM);
+       /* EXPORT_NORM is an optimzation that can be enabled for better
+        * performance in certain cases
+        */
+       if (rctx->family < CHIP_RV770) {
+               /* EXPORT_NORM can be enabled if:
+                * - 11-bit or smaller UNORM/SNORM/SRGB
+                * - BLEND_CLAMP is enabled
+                * - BLEND_FLOAT32 is disabled
+                */
+               if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
+                   (desc->channel[i].size < 12 &&
+                    desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
+                    ntype != V_0280A0_NUMBER_UINT &&
+                    ntype != V_0280A0_NUMBER_SINT) &&
+                   G_0280A0_BLEND_CLAMP(color_info) &&
+                   !G_0280A0_BLEND_FLOAT32(color_info))
+                       color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM);
+       } else {
+               /* EXPORT_NORM can be enabled if:
+                * - 11-bit or smaller UNORM/SNORM/SRGB
+                * - 16-bit or smaller FLOAT
+                */
+               if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS &&
+                   ((desc->channel[i].size < 12 &&
+                     desc->channel[i].type != UTIL_FORMAT_TYPE_FLOAT &&
+                     ntype != V_0280A0_NUMBER_UINT && ntype != V_0280A0_NUMBER_SINT) ||
+                   (desc->channel[i].size < 17 &&
+                    desc->channel[i].type == UTIL_FORMAT_TYPE_FLOAT)))
+                       color_info |= S_0280A0_SOURCE_FORMAT(V_0280A0_EXPORT_NORM);
+       }
 
        r600_pipe_state_add_reg(rstate,
                                R_028040_CB_COLOR0_BASE + cb * 4,