r600g: drop two unused | 0 that are actually in word4 anyways.
[mesa.git] / src / gallium / drivers / r600 / r600_state.c
index 19bfa81b99adf5f4365a13698543ecabc4e5a3aa..01c59072a266a1001e6f01dc5a89990071cd025e 100644 (file)
@@ -458,7 +458,7 @@ static struct pipe_sampler_view *r600_create_sampler_view(struct pipe_context *c
        r600_pipe_state_add_reg(rstate, R_03800C_RESOURCE0_WORD3,
                                (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_NUM_FORMAT_ALL(V_038010_SQ_NUM_FORMAT_NORM) |
+                               word4 |
                                S_038010_SRF_MODE_ALL(V_038010_SRF_MODE_NO_ZERO) |
                                S_038010_REQUEST_SIZE(1) |
                                S_038010_BASE_LEVEL(state->u.tex.first_level), 0xFFFFFFFF, NULL);
@@ -495,9 +495,11 @@ static void r600_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
        for (i = 0; i < count; i++) {
                if (&rctx->ps_samplers.views[i]->base != views[i]) {
                        if (resource[i])
-                               r600_context_pipe_state_set_ps_resource(&rctx->ctx, &resource[i]->state, i);
+                               r600_context_pipe_state_set_ps_resource(&rctx->ctx, &resource[i]->state,
+                                                                       i + R600_MAX_CONST_BUFFERS);
                        else
-                               r600_context_pipe_state_set_ps_resource(&rctx->ctx, NULL, i);
+                               r600_context_pipe_state_set_ps_resource(&rctx->ctx, NULL,
+                                                                       i + R600_MAX_CONST_BUFFERS);
 
                        pipe_sampler_view_reference(
                                (struct pipe_sampler_view **)&rctx->ps_samplers.views[i],
@@ -507,7 +509,8 @@ static void r600_set_ps_sampler_view(struct pipe_context *ctx, unsigned count,
        }
        for (i = count; i < NUM_TEX_UNITS; i++) {
                if (rctx->ps_samplers.views[i]) {
-                       r600_context_pipe_state_set_ps_resource(&rctx->ctx, NULL, i);
+                       r600_context_pipe_state_set_ps_resource(&rctx->ctx, NULL,
+                                                               i + R600_MAX_CONST_BUFFERS);
                        pipe_sampler_view_reference((struct pipe_sampler_view **)&rctx->ps_samplers.views[i], NULL);
                }
        }
@@ -689,6 +692,7 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        unsigned offset;
        const struct util_format_description *desc;
        struct r600_bo *bo[3];
+       int i;
 
        surf = (struct r600_surface *)state->cbufs[cb];
        rtex = (struct r600_resource_texture*)state->cbufs[cb]->texture;
@@ -704,24 +708,34 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        bo[2] = rbuffer->bo;
 
        /* XXX quite sure for dx10+ hw don't need any offset hacks */
-       offset = r600_texture_get_offset((struct r600_resource_texture *)state->cbufs[cb]->texture,
+       offset = r600_texture_get_offset(rtex,
                                         level, state->cbufs[cb]->u.tex.first_layer);
        pitch = rtex->pitch_in_pixels[level] / 8 - 1;
        slice = rtex->pitch_in_pixels[level] * surf->aligned_height / 64 - 1;
        ntype = 0;
-       desc = util_format_description(rtex->resource.base.b.format);
+       desc = util_format_description(surf->base.format);
        if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
                ntype = V_0280A0_NUMBER_SRGB;
 
-       format = r600_translate_colorformat(rtex->resource.base.b.format);
-       swap = r600_translate_colorswap(rtex->resource.base.b.format);
+       for (i = 0; i < 4; i++) {
+               if (desc->channel[i].type != UTIL_FORMAT_TYPE_VOID) {
+                       break;
+               }
+       }
+
+       format = r600_translate_colorformat(surf->base.format);
+       swap = r600_translate_colorswap(surf->base.format);
        color_info = S_0280A0_FORMAT(format) |
                S_0280A0_COMP_SWAP(swap) |
                S_0280A0_ARRAY_MODE(rtex->array_mode[level]) |
                S_0280A0_BLEND_CLAMP(1) |
                S_0280A0_NUMBER_TYPE(ntype);
-       if (desc->colorspace != UTIL_FORMAT_COLORSPACE_ZS)
-               color_info |= S_0280A0_SOURCE_FORMAT(1);
+
+       /* 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);
 
        r600_pipe_state_add_reg(rstate,
                                R_028040_CB_COLOR0_BASE + cb * 4,
@@ -1218,11 +1232,10 @@ void *r600_create_db_flush_dsa(struct r600_pipe_context *rctx)
        return rstate;
 }
 
-void r600_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
-                                struct r600_pipe_state *rstate,
-                                unsigned index,
-                                struct r600_resource *rbuffer,
-                                unsigned offset, unsigned stride)
+void r600_pipe_set_buffer_resource(struct r600_pipe_context *rctx,
+                                  struct r600_pipe_state *rstate,
+                                  struct r600_resource *rbuffer,
+                                  unsigned offset, unsigned stride)
 {
        r600_pipe_state_add_reg(rstate, R_038000_RESOURCE0_WORD0,
                                offset, 0xFFFFFFFF, rbuffer->bo);
@@ -1239,5 +1252,4 @@ void r600_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
                                0x00000000, 0xFFFFFFFF, NULL);
        r600_pipe_state_add_reg(rstate, R_038018_RESOURCE0_WORD6,
                                0xC0000000, 0xFFFFFFFF, NULL);
-       r600_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, index);
 }