ilo: switch to ilo states for VF stage
authorChia-I Wu <olvaffe@gmail.com>
Wed, 29 May 2013 06:25:34 +0000 (14:25 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Fri, 7 Jun 2013 03:13:14 +0000 (11:13 +0800)
Define and use

 struct ilo_vb_state;
 struct ilo_ve_state;
 struct ilo_ib_state;

in ilo_context.

src/gallium/drivers/ilo/ilo_3d.c
src/gallium/drivers/ilo/ilo_3d_pipeline_gen6.c
src/gallium/drivers/ilo/ilo_3d_pipeline_gen7.c
src/gallium/drivers/ilo/ilo_blit.c
src/gallium/drivers/ilo/ilo_context.h
src/gallium/drivers/ilo/ilo_gpe.h
src/gallium/drivers/ilo/ilo_state.c

index ba3fa96d513adf492f2b926c305616282174b4f3..e6ed4c9c50fc67236f5bf7fbe3be8946cb546e44 100644 (file)
@@ -535,7 +535,7 @@ ilo_check_restart_index(struct ilo_context *ilo,
       return true;
 
    /* Note: indices must be unsigned byte, unsigned short or unsigned int */
-   switch (ilo->index_buffer.index_size) {
+   switch (ilo->ib.state.index_size) {
    case 1:
       return ((info->restart_index & 0xff) == 0xff);
       break;
@@ -607,15 +607,11 @@ ilo_draw_vbo_with_sw_restart(struct pipe_context *pipe,
 
    struct pipe_transfer *transfer = NULL;
    const void *map = NULL;
-   map = pipe_buffer_map(pipe,
-           ilo->index_buffer.buffer,
-           PIPE_TRANSFER_READ,
-           &transfer);
-
-   sub_prim_count = ilo_find_sub_primitives(map + ilo->index_buffer.offset,
-           ilo->index_buffer.index_size,
-           info,
-           restart_info);
+   map = pipe_buffer_map(pipe, ilo->ib.state.buffer,
+         PIPE_TRANSFER_READ, &transfer);
+
+   sub_prim_count = ilo_find_sub_primitives(map + ilo->ib.state.offset,
+           ilo->ib.state.index_size, info, restart_info);
 
    pipe_buffer_unmap(pipe, transfer);
 
index 6eef701295f1d7880978956e862193ff3ac4dfd4..e0aff6d221c972f08f8aa88e4e91203c6faad7b5 100644 (file)
@@ -290,8 +290,8 @@ gen6_pipeline_common_urb(struct ilo_3d_pipeline *p,
        *          VS-generated output data, output URB availability isn't a
        *          factor."
        */
-      if (vs_entry_size < ilo->vertex_elements->num_elements)
-         vs_entry_size = ilo->vertex_elements->num_elements;
+      if (vs_entry_size < ilo->ve->count)
+         vs_entry_size = ilo->ve->count;
 
       gs_entry_size = (gs) ? gs->out.count :
          (vs && vs->stream_output) ? vs_entry_size : 0;
@@ -398,19 +398,18 @@ gen6_pipeline_vf(struct ilo_3d_pipeline *p,
    /* 3DSTATE_INDEX_BUFFER */
    if (DIRTY(INDEX_BUFFER)) {
       p->gen6_3DSTATE_INDEX_BUFFER(p->dev,
-            &ilo->index_buffer, session->info->primitive_restart, p->cp);
+            &ilo->ib.state, session->info->primitive_restart, p->cp);
    }
 
    /* 3DSTATE_VERTEX_BUFFERS */
    if (DIRTY(VERTEX_BUFFERS)) {
       p->gen6_3DSTATE_VERTEX_BUFFERS(p->dev,
-            ilo->vertex_buffers.buffers, NULL,
-            (1 << ilo->vertex_buffers.num_buffers) - 1, p->cp);
+            ilo->vb.states, NULL, ilo->vb.enabled_mask, p->cp);
    }
 
    /* 3DSTATE_VERTEX_ELEMENTS */
    if (DIRTY(VERTEX_ELEMENTS) || DIRTY(VS)) {
-      const struct ilo_vertex_element *ive = ilo->vertex_elements;
+      const struct ilo_ve_state *ve = ilo->ve;
       bool last_velement_edgeflag = false;
       bool prepend_generate_ids = false;
 
@@ -419,7 +418,7 @@ gen6_pipeline_vf(struct ilo_3d_pipeline *p,
 
          if (info->edgeflag_in >= 0) {
             /* we rely on the state tracker here */
-            assert(info->edgeflag_in ==  ive->num_elements - 1);
+            assert(info->edgeflag_in == ve->count - 1);
             last_velement_edgeflag = true;
          }
 
@@ -427,7 +426,7 @@ gen6_pipeline_vf(struct ilo_3d_pipeline *p,
       }
 
       p->gen6_3DSTATE_VERTEX_ELEMENTS(p->dev,
-            ive->elements, ive->num_elements,
+            ve->states, ve->count,
             last_velement_edgeflag, prepend_generate_ids, p->cp);
    }
 }
index a2e7ea2304cdd0bdf1dbece2c825c2ac67866b8b..e53eb6432a404ad7c8bc22708b249cfed089d8fe 100644 (file)
@@ -202,8 +202,8 @@ gen7_pipeline_common_urb(struct ilo_3d_pipeline *p,
        *      Allocation Size must be sized to the maximum of the vertex input
        *      and output structures."
        */
-      if (vs_entry_size < ilo->vertex_elements->num_elements)
-         vs_entry_size = ilo->vertex_elements->num_elements;
+      if (vs_entry_size < ilo->ve->count)
+         vs_entry_size = ilo->ve->count;
 
       vs_entry_size *= sizeof(float) * 4;
       vs_total_size = ilo->dev->urb_size - offset;
index 4ef9b30c73ec6331f503a442aeb11699f179c11d..e38d51f225688900d087b36dcc792e1c4bd025bf 100644 (file)
@@ -542,9 +542,8 @@ static void
 ilo_blitter_begin(struct ilo_context *ilo, enum ilo_blitter_op op)
 {
    /* as documented in util/u_blitter.h */
-   util_blitter_save_vertex_buffer_slot(ilo->blitter,
-         ilo->vertex_buffers.buffers);
-   util_blitter_save_vertex_elements(ilo->blitter, ilo->vertex_elements);
+   util_blitter_save_vertex_buffer_slot(ilo->blitter, ilo->vb.states);
+   util_blitter_save_vertex_elements(ilo->blitter, (void *) ilo->ve);
    util_blitter_save_vertex_shader(ilo->blitter, ilo->vs);
    util_blitter_save_geometry_shader(ilo->blitter, ilo->gs);
    util_blitter_save_so_targets(ilo->blitter,
index 7d691399b68ba2f5696de3f45334f609327c8f50..07905b70176c2b535dbcddc541ff707081d337af 100644 (file)
@@ -41,11 +41,6 @@ struct ilo_cp;
 struct ilo_screen;
 struct ilo_shader_state;
 
-struct ilo_vertex_element {
-   struct pipe_vertex_element elements[PIPE_MAX_ATTRIBS];
-   unsigned num_elements;
-};
-
 struct ilo_context {
    struct pipe_context base;
 
@@ -61,13 +56,16 @@ struct ilo_context {
 
    uint32_t dirty;
 
+   struct ilo_vb_state vb;
+   const struct ilo_ve_state *ve;
+   struct ilo_ib_state ib;
+
    struct pipe_blend_state *blend;
    struct pipe_rasterizer_state *rasterizer;
    struct pipe_depth_stencil_alpha_state *depth_stencil_alpha;
    struct ilo_shader_state *fs;
    struct ilo_shader_state *vs;
    struct ilo_shader_state *gs;
-   struct ilo_vertex_element *vertex_elements;
 
    struct pipe_blend_color blend_color;
    struct pipe_stencil_ref stencil_ref;
@@ -77,12 +75,6 @@ struct ilo_context {
    struct pipe_poly_stipple poly_stipple;
    struct pipe_scissor_state scissor;
    struct pipe_viewport_state viewport;
-   struct pipe_index_buffer index_buffer;
-
-   struct {
-      struct pipe_vertex_buffer buffers[PIPE_MAX_ATTRIBS];
-      unsigned num_buffers;
-   } vertex_buffers;
 
    struct {
       struct pipe_sampler_state *samplers[ILO_MAX_SAMPLERS];
index 5fd2309237ff11ab6aa4fbe0b2c587a7c3bdbf78..7c103aa3842fe86949d2709df58f5b5ae55abf6e 100644 (file)
 #define ILO_WM_CONST_SURFACE(i)    (ILO_MAX_DRAW_BUFFERS + i)
 #define ILO_WM_TEXTURE_SURFACE(i)  (ILO_MAX_DRAW_BUFFERS + ILO_MAX_CONST_BUFFERS  + i)
 
+struct ilo_vb_state {
+   struct pipe_vertex_buffer states[PIPE_MAX_ATTRIBS];
+   uint32_t enabled_mask;
+};
+
+struct ilo_ib_state {
+   struct pipe_index_buffer state;
+};
+
+struct ilo_ve_state {
+   struct pipe_vertex_element states[PIPE_MAX_ATTRIBS];
+   unsigned count;
+};
+
 #endif /* ILO_GPE_H */
index 33da429bf374ff35e6f1456dc194bd2559f5e2e1..75b87d872a577b8495bc6a287de84e8a776b0d80 100644 (file)
@@ -436,15 +436,15 @@ ilo_create_vertex_elements_state(struct pipe_context *pipe,
                                  unsigned num_elements,
                                  const struct pipe_vertex_element *elements)
 {
-   struct ilo_vertex_element *velem;
+   struct ilo_ve_state *ve;
 
-   velem = MALLOC_STRUCT(ilo_vertex_element);
-   assert(velem);
+   ve = MALLOC_STRUCT(ilo_ve_state);
+   assert(ve);
 
-   memcpy(velem->elements, elements, sizeof(*elements) * num_elements);
-   velem->num_elements = num_elements;
+   memcpy(ve->states, elements, sizeof(*elements) * num_elements);
+   ve->count = num_elements;
 
-   return velem;
+   return ve;
 }
 
 static void
@@ -452,7 +452,7 @@ ilo_bind_vertex_elements_state(struct pipe_context *pipe, void *state)
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   ilo->vertex_elements = state;
+   ilo->ve = state;
 
    ilo->dirty |= ILO_DIRTY_VERTEX_ELEMENTS;
 }
@@ -460,7 +460,9 @@ ilo_bind_vertex_elements_state(struct pipe_context *pipe, void *state)
 static void
 ilo_delete_vertex_elements_state(struct pipe_context *pipe, void *state)
 {
-   FREE(state);
+   struct ilo_ve_state *ve = state;
+
+   FREE(ve);
 }
 
 static void
@@ -722,8 +724,8 @@ ilo_set_vertex_buffers(struct pipe_context *pipe,
 {
    struct ilo_context *ilo = ilo_context(pipe);
 
-   util_set_vertex_buffers_count(ilo->vertex_buffers.buffers,
-         &ilo->vertex_buffers.num_buffers, buffers, start_slot, num_buffers);
+   util_set_vertex_buffers_mask(ilo->vb.states,
+         &ilo->vb.enabled_mask, buffers, start_slot, num_buffers);
 
    ilo->dirty |= ILO_DIRTY_VERTEX_BUFFERS;
 }
@@ -735,16 +737,16 @@ ilo_set_index_buffer(struct pipe_context *pipe,
    struct ilo_context *ilo = ilo_context(pipe);
 
    if (state) {
-      ilo->index_buffer.index_size = state->index_size;
-      ilo->index_buffer.offset = state->offset;
-      pipe_resource_reference(&ilo->index_buffer.buffer, state->buffer);
-      ilo->index_buffer.user_buffer = state->user_buffer;
+      ilo->ib.state.index_size = state->index_size;
+      ilo->ib.state.offset = state->offset;
+      pipe_resource_reference(&ilo->ib.state.buffer, state->buffer);
+      ilo->ib.state.user_buffer = state->user_buffer;
    }
    else {
-      ilo->index_buffer.index_size = 0;
-      ilo->index_buffer.offset = 0;
-      pipe_resource_reference(&ilo->index_buffer.buffer, NULL);
-      ilo->index_buffer.user_buffer = NULL;
+      ilo->ib.state.index_size = 0;
+      ilo->ib.state.offset = 0;
+      pipe_resource_reference(&ilo->ib.state.buffer, NULL);
+      ilo->ib.state.user_buffer = NULL;
    }
 
    ilo->dirty |= ILO_DIRTY_INDEX_BUFFER;