Merge remote branch 'origin/master' into pipe-video
[mesa.git] / src / gallium / drivers / r600 / r600_state.c
index 2ba15b818aaf460fd7e22d8f362027c10ba41022..8b001e11f4af96f4878fc40641c40a0d92c7b571 100644 (file)
@@ -36,7 +36,6 @@
 #include <util/u_pack_color.h>
 #include <util/u_memory.h>
 #include <util/u_inlines.h>
-#include <util/u_upload_mgr.h>
 #include <util/u_framebuffer.h>
 #include <pipebuffer/pb_buffer.h>
 #include "r600.h"
@@ -136,11 +135,6 @@ void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
        if (rctx->vertex_elements == NULL || !rctx->nvertex_buffer)
                return;
 
-       /* delete previous translated vertex elements */
-       if (rctx->tran.new_velems) {
-               r600_end_vertex_translate(rctx);
-       }
-
        if (rctx->vertex_elements->incompatible_layout) {
                /* translate rebind new vertex elements so
                 * return once translated
@@ -173,21 +167,21 @@ void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
                        vbuffer_index = rctx->vertex_elements->elements[i].vertex_buffer_index;
                        vertex_buffer = &rctx->vertex_buffer[vbuffer_index];
                        rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-                       offset = rctx->vertex_elements->vbuffer_offset[i] +
-                               vertex_buffer->buffer_offset +
-                               r600_bo_offset(rbuffer->bo);
+                       offset = rctx->vertex_elements->vbuffer_offset[i];
                } else {
                        /* bind vertex buffer once */
                        vertex_buffer = &rctx->vertex_buffer[i];
                        rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-                       offset = vertex_buffer->buffer_offset +
-                               r600_bo_offset(rbuffer->bo);
+                       offset = 0;
                }
+               if (vertex_buffer == NULL || rbuffer == NULL)
+                       continue;
+               offset += vertex_buffer->buffer_offset + r600_bo_offset(rbuffer->bo);
 
                r600_pipe_state_add_reg(rstate, R_038000_RESOURCE0_WORD0,
                                        offset, 0xFFFFFFFF, rbuffer->bo);
                r600_pipe_state_add_reg(rstate, R_038004_RESOURCE0_WORD1,
-                                       rbuffer->size - offset - 1, 0xFFFFFFFF, NULL);
+                                       rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
                r600_pipe_state_add_reg(rstate, R_038008_RESOURCE0_WORD2,
                                        S_038008_STRIDE(vertex_buffer->stride),
                                        0xFFFFFFFF, NULL);
@@ -206,11 +200,9 @@ void r600_vertex_buffer_update(struct r600_pipe_context *rctx)
 static void r600_draw_common(struct r600_drawl *draw)
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)draw->ctx;
-       struct r600_pipe_state *rstate;
        struct r600_resource *rbuffer;
-       unsigned i, j, offset, prim;
+       unsigned prim;
        u32 vgt_dma_index_type, vgt_draw_initiator, mask;
-       struct pipe_vertex_buffer *vertex_buffer;
        struct r600_draw rdraw;
        struct r600_pipe_state vgt;
 
@@ -248,46 +240,8 @@ static void r600_draw_common(struct r600_drawl *draw)
                return;
        }
 
-#if 0
-       /* rebuild vertex shader if input format changed */
-       if (r600_pipe_shader_update(&rctx->context, rctx->vs_shader))
-               return;
-       if (r600_pipe_shader_update(&rctx->context, rctx->ps_shader))
-               return;
-#endif
-
        r600_spi_update(rctx);
 
-#if 0
-       for (i = 0 ; i < rctx->vertex_elements->count; i++) {
-               uint32_t word2, format;
-
-               rstate = &rctx->vs_resource[i];
-               rstate->id = R600_PIPE_STATE_RESOURCE;
-               rstate->nregs = 0;
-
-               j = rctx->vertex_elements->elements[i].vertex_buffer_index;
-               vertex_buffer = &rctx->vertex_buffer[j];
-               rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-               offset = rctx->vertex_elements->elements[i].src_offset +
-                       vertex_buffer->buffer_offset +
-                       r600_bo_offset(rbuffer->bo);
-
-               format = r600_translate_vertex_data_type(rctx->vertex_elements->hw_format[i]);
-
-               word2 = format | S_038008_STRIDE(vertex_buffer->stride);
-
-               r600_pipe_state_add_reg(rstate, R_038000_RESOURCE0_WORD0, offset, 0xFFFFFFFF, rbuffer->bo);
-               r600_pipe_state_add_reg(rstate, R_038004_RESOURCE0_WORD1, rbuffer->size - offset - 1, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_038008_RESOURCE0_WORD2, word2, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_03800C_RESOURCE0_WORD3, 0x00000000, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_038010_RESOURCE0_WORD4, 0x00000000, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_038014_RESOURCE0_WORD5, 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, i);
-       }
-#endif
-
        mask = 0;
        for (int i = 0; i < rctx->framebuffer.nr_cbufs; i++) {
                mask |= (0xF << (i * 4));
@@ -321,19 +275,6 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
        struct r600_drawl draw;
-       boolean translate = FALSE;
-
-#if 0
-       if (rctx->vertex_elements->incompatible_layout) {
-               r600_begin_vertex_translate(rctx);
-               translate = TRUE;
-       }
-
-       if (rctx->any_user_vbs) {
-               r600_upload_user_buffers(rctx);
-               rctx->any_user_vbs = FALSE;
-       }
-#endif
 
        memset(&draw, 0, sizeof(struct r600_drawl));
        draw.ctx = ctx;
@@ -365,9 +306,6 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
        }
        r600_draw_common(&draw);
 
-       if (translate)
-               r600_end_vertex_translate(rctx);
-
        pipe_resource_reference(&draw.index_buffer, NULL);
 }
 
@@ -987,6 +925,17 @@ static void r600_cb(struct r600_pipe_context *rctx, struct r600_pipe_state *rsta
        desc = util_format_description(rtex->resource.base.b.format);
        if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB)
                ntype = V_0280A0_NUMBER_SRGB;
+        else if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
+               switch(desc->channel[0].type) {
+               case UTIL_FORMAT_TYPE_UNSIGNED:
+                       ntype = V_0280A0_NUMBER_UNORM;
+                       break;
+
+               case UTIL_FORMAT_TYPE_SIGNED:
+                       ntype = V_0280A0_NUMBER_SNORM;
+                       break;
+               }
+       }
 
        format = r600_translate_colorformat(rtex->resource.base.b.format);
        swap = r600_translate_colorswap(rtex->resource.base.b.format);
@@ -1081,8 +1030,6 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx,
 
        util_copy_framebuffer_state(&rctx->framebuffer, state);
 
-       rctx->pframebuffer = &rctx->framebuffer;
-
        /* build states */
        for (int i = 0; i < state->nr_cbufs; i++) {
                r600_cb(rctx, rstate, state, i);