r600g: consolidate set_constant_buffer functions
[mesa.git] / src / gallium / drivers / r600 / evergreen_state.c
index 8bafb5a06fc6bac44b901b742447ec4fac50a4fc..fa239a816b530d988cd9e57505f192368476d6db 100644 (file)
@@ -837,54 +837,6 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx,
        }
 }
 
-static void evergreen_set_constant_buffer(struct pipe_context *ctx, uint shader, uint index,
-                                       struct pipe_resource *buffer)
-{
-       struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
-       struct r600_resource_buffer *rbuffer = r600_buffer(buffer);
-       uint32_t offset;
-
-       /* Note that the state tracker can unbind constant buffers by
-        * passing NULL here.
-        */
-       if (buffer == NULL) {
-               return;
-       }
-
-       r600_upload_const_buffer(rctx, &rbuffer, &offset);
-
-       switch (shader) {
-       case PIPE_SHADER_VERTEX:
-               rctx->vs_const_buffer.nregs = 0;
-               r600_pipe_state_add_reg(&rctx->vs_const_buffer,
-                                       R_028180_ALU_CONST_BUFFER_SIZE_VS_0,
-                                       ALIGN_DIVUP(buffer->width0 >> 4, 16),
-                                       0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(&rctx->vs_const_buffer,
-                                       R_028980_ALU_CONST_CACHE_VS_0,
-                                       (r600_bo_offset(rbuffer->r.bo) + offset) >> 8, 0xFFFFFFFF, rbuffer->r.bo);
-               r600_context_pipe_state_set(&rctx->ctx, &rctx->vs_const_buffer);
-               break;
-       case PIPE_SHADER_FRAGMENT:
-               rctx->ps_const_buffer.nregs = 0;
-               r600_pipe_state_add_reg(&rctx->ps_const_buffer,
-                                       R_028140_ALU_CONST_BUFFER_SIZE_PS_0,
-                                       ALIGN_DIVUP(buffer->width0 >> 4, 16),
-                                       0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(&rctx->ps_const_buffer,
-                                       R_028940_ALU_CONST_CACHE_PS_0,
-                                       (r600_bo_offset(rbuffer->r.bo) + offset) >> 8, 0xFFFFFFFF, rbuffer->r.bo);
-               r600_context_pipe_state_set(&rctx->ctx, &rctx->ps_const_buffer);
-               break;
-       default:
-               R600_ERR("unsupported %d\n", shader);
-               return;
-       }
-
-       if (!rbuffer->user_buffer)
-               pipe_resource_reference((struct pipe_resource**)&rbuffer, NULL);
-}
-
 void evergreen_init_state_functions(struct r600_pipe_context *rctx)
 {
        rctx->context.create_blend_state = evergreen_create_blend_state;
@@ -912,7 +864,7 @@ void evergreen_init_state_functions(struct r600_pipe_context *rctx)
        rctx->context.delete_vs_state = r600_delete_vs_shader;
        rctx->context.set_blend_color = evergreen_set_blend_color;
        rctx->context.set_clip_state = evergreen_set_clip_state;
-       rctx->context.set_constant_buffer = evergreen_set_constant_buffer;
+       rctx->context.set_constant_buffer = r600_set_constant_buffer;
        rctx->context.set_fragment_sampler_views = evergreen_set_ps_sampler_view;
        rctx->context.set_framebuffer_state = evergreen_set_framebuffer_state;
        rctx->context.set_polygon_stipple = evergreen_set_polygon_stipple;
@@ -1328,85 +1280,6 @@ void evergreen_polygon_offset_update(struct r600_pipe_context *rctx)
        }
 }
 
-void evergreen_vertex_buffer_update(struct r600_pipe_context *rctx)
-{
-       struct r600_pipe_state *rstate;
-       struct r600_resource *rbuffer;
-       struct pipe_vertex_buffer *vertex_buffer;
-       unsigned i, offset;
-
-       /* we don't update until we know vertex elements */
-       if (rctx->vertex_elements == NULL || !rctx->nvertex_buffer)
-               return;
-
-       if (rctx->vertex_elements->incompatible_layout) {
-               /* translate rebind new vertex elements so
-                * return once translated
-                */
-               r600_begin_vertex_translate(rctx);
-               return;
-       }
-
-       if (rctx->any_user_vbs) {
-               r600_upload_user_buffers(rctx);
-               rctx->any_user_vbs = FALSE;
-       }
-
-       if (rctx->vertex_elements->vbuffer_need_offset) {
-               /* one resource per vertex elements */
-               rctx->nvs_resource = rctx->vertex_elements->count;
-       } else {
-               /* bind vertex buffer once */
-               rctx->nvs_resource = rctx->nvertex_buffer;
-       }
-
-       for (i = 0 ; i < rctx->nvs_resource; i++) {
-               rstate = &rctx->vs_resource[i];
-               rstate->id = R600_PIPE_STATE_RESOURCE;
-               rstate->nregs = 0;
-
-               if (rctx->vertex_elements->vbuffer_need_offset) {
-                       /* one resource per vertex elements */
-                       unsigned vbuffer_index;
-                       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];
-               } else {
-                       /* bind vertex buffer once */
-                       vertex_buffer = &rctx->vertex_buffer[i];
-                       rbuffer = (struct r600_resource*)vertex_buffer->buffer;
-                       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_030000_RESOURCE0_WORD0,
-                                       offset, 0xFFFFFFFF, rbuffer->bo);
-               r600_pipe_state_add_reg(rstate, R_030004_RESOURCE0_WORD1,
-                                       rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_030008_RESOURCE0_WORD2,
-                                       S_030008_STRIDE(vertex_buffer->stride),
-                                       0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_03000C_RESOURCE0_WORD3,
-                                       S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
-                                       S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
-                                       S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
-                                       S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W),
-                                       0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_030010_RESOURCE0_WORD4,
-                                       0x00000000, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_030014_RESOURCE0_WORD5,
-                                       0x00000000, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6,
-                                       0x00000000, 0xFFFFFFFF, NULL);
-               r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7,
-                                       0xC0000000, 0xFFFFFFFF, NULL);
-               evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, i);
-       }
-}
-
 void evergreen_pipe_shader_ps(struct pipe_context *ctx, struct r600_pipe_shader *shader)
 {
        struct r600_pipe_state *rstate = &shader->rstate;
@@ -1605,3 +1478,33 @@ void *evergreen_create_db_flush_dsa(struct r600_pipe_context *rctx)
                                S_028000_COPY_CENTROID(1), NULL);
        return rstate;
 }
+
+void evergreen_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
+                                     struct r600_pipe_state *rstate,
+                                     unsigned index,
+                                     struct r600_resource *rbuffer,
+                                     unsigned offset, unsigned stride)
+{
+       r600_pipe_state_add_reg(rstate, R_030000_RESOURCE0_WORD0,
+                               offset, 0xFFFFFFFF, rbuffer->bo);
+       r600_pipe_state_add_reg(rstate, R_030004_RESOURCE0_WORD1,
+                               rbuffer->bo_size - offset - 1, 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_030008_RESOURCE0_WORD2,
+                               S_030008_STRIDE(stride),
+                               0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_03000C_RESOURCE0_WORD3,
+                               S_03000C_DST_SEL_X(V_03000C_SQ_SEL_X) |
+                               S_03000C_DST_SEL_Y(V_03000C_SQ_SEL_Y) |
+                               S_03000C_DST_SEL_Z(V_03000C_SQ_SEL_Z) |
+                               S_03000C_DST_SEL_W(V_03000C_SQ_SEL_W),
+                               0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_030010_RESOURCE0_WORD4,
+                               0x00000000, 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_030014_RESOURCE0_WORD5,
+                               0x00000000, 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_030018_RESOURCE0_WORD6,
+                               0x00000000, 0xFFFFFFFF, NULL);
+       r600_pipe_state_add_reg(rstate, R_03001C_RESOURCE0_WORD7,
+                               0xC0000000, 0xFFFFFFFF, NULL);
+       evergreen_context_pipe_state_set_fs_resource(&rctx->ctx, rstate, index);
+}