u_vbuf: override set_index_buffer
authorMarek Olšák <maraeo@gmail.com>
Sat, 31 Mar 2012 02:56:48 +0000 (04:56 +0200)
committerMarek Olšák <maraeo@gmail.com>
Mon, 23 Apr 2012 23:39:21 +0000 (01:39 +0200)
This makes u_vbuf_mgr call the driver instead of the other way around.

src/gallium/auxiliary/util/u_vbuf.c
src/gallium/auxiliary/util/u_vbuf.h
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_render.c
src/gallium/drivers/r300/r300_state.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state_common.c

index 50c35afd5635bb16ed65ad02db8cc59a9d3e9bbc..7883845de856a9e17ff5de76fb7c37ad21c7bc3d 100644 (file)
@@ -70,6 +70,9 @@ struct u_vbuf_priv {
    struct translate_cache *translate_cache;
    struct cso_cache *cso_cache;
 
+   /* The index buffer. */
+   struct pipe_index_buffer index_buffer;
+
    /* Vertex element state bound by the state tracker. */
    void *saved_ve;
    /* and its associated helper structure for this module. */
@@ -93,6 +96,9 @@ struct u_vbuf_priv {
    boolean incompatible_vb_layout;
    /* Per-buffer flags. */
    boolean incompatible_vb[PIPE_MAX_ATTRIBS];
+
+   void (*driver_set_index_buffer)(struct pipe_context *pipe,
+                                  const struct pipe_index_buffer *);
 };
 
 static void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr)
@@ -124,6 +130,8 @@ static void u_vbuf_init_format_caps(struct u_vbuf_priv *mgr)
                                   0, PIPE_BIND_VERTEX_BUFFER);
 }
 
+static void u_vbuf_install(struct u_vbuf_priv *mgr);
+
 struct u_vbuf *
 u_vbuf_create(struct pipe_context *pipe,
               unsigned upload_buffer_size,
@@ -146,7 +154,7 @@ u_vbuf_create(struct pipe_context *pipe,
          fetch_alignment == U_VERTEX_FETCH_BYTE_ALIGNED;
 
    u_vbuf_init_format_caps(mgr);
-
+   u_vbuf_install(mgr);
    return &mgr->b;
 }
 
@@ -195,6 +203,9 @@ void u_vbuf_destroy(struct u_vbuf *mgrb)
    struct u_vbuf_priv *mgr = (struct u_vbuf_priv*)mgrb;
    unsigned i;
 
+   assert(mgr->pipe->draw);
+   mgr->pipe->draw = NULL;
+
    for (i = 0; i < mgr->b.nr_vertex_buffers; i++) {
       pipe_resource_reference(&mgr->b.vertex_buffer[i].buffer, NULL);
    }
@@ -256,7 +267,7 @@ u_vbuf_translate_buffers(struct u_vbuf_priv *mgr, struct translate_key *key,
 
    /* Translate. */
    if (unroll_indices) {
-      struct pipe_index_buffer *ib = &mgr->b.index_buffer;
+      struct pipe_index_buffer *ib = &mgr->index_buffer;
       struct pipe_transfer *transfer = NULL;
       unsigned offset = ib->offset + start_index * ib->index_size;
       uint8_t *map;
@@ -732,9 +743,11 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgrb,
    mgr->b.nr_real_vertex_buffers = count;
 }
 
-void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
-                             const struct pipe_index_buffer *ib)
+static void u_vbuf_set_index_buffer(struct pipe_context *pipe,
+                                    const struct pipe_index_buffer *ib)
 {
+   struct u_vbuf_priv *mgr = pipe->draw;
+
    if (ib && ib->buffer) {
       assert(ib->offset % ib->index_size == 0);
       pipe_resource_reference(&mgr->index_buffer.buffer, ib->buffer);
@@ -743,6 +756,8 @@ void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
    } else {
       pipe_resource_reference(&mgr->index_buffer.buffer, NULL);
    }
+
+   mgr->driver_set_index_buffer(pipe, ib);
 }
 
 static void
@@ -1068,7 +1083,7 @@ u_vbuf_draw_begin(struct u_vbuf *mgrb,
          max_index = info->max_index;
          index_bounds_valid = true;
       } else if (u_vbuf_need_minmax_index(mgr)) {
-         u_vbuf_get_minmax_index(mgr->pipe, &mgr->b.index_buffer, info,
+         u_vbuf_get_minmax_index(mgr->pipe, &mgr->index_buffer, info,
                                  &min_index, &max_index);
          index_bounds_valid = true;
       }
@@ -1161,3 +1176,13 @@ void u_vbuf_draw_end(struct u_vbuf *mgrb)
       u_vbuf_translate_end(mgr);
    }
 }
+
+static void u_vbuf_install(struct u_vbuf_priv *mgr)
+{
+   struct pipe_context *pipe = mgr->pipe;
+   assert(!pipe->draw);
+
+   pipe->draw = mgr;
+   mgr->driver_set_index_buffer = pipe->set_index_buffer;
+   pipe->set_index_buffer = u_vbuf_set_index_buffer;
+}
index 3669c9b874ae171e43de2ad4d626c1cf76e77c9f..4a449fca972a0d54093366a6e40f98828a5a73fc 100644 (file)
@@ -67,9 +67,6 @@ struct u_vbuf {
    struct pipe_vertex_buffer real_vertex_buffer[PIPE_MAX_ATTRIBS];
    int nr_real_vertex_buffers;
 
-   /* The index buffer. */
-   struct pipe_index_buffer index_buffer;
-
    /* This uploader can optionally be used by the driver.
     *
     * Allowed functions:
@@ -126,9 +123,6 @@ void u_vbuf_set_vertex_buffers(struct u_vbuf *mgr,
                                unsigned count,
                                const struct pipe_vertex_buffer *bufs);
 
-void u_vbuf_set_index_buffer(struct u_vbuf *mgr,
-                             const struct pipe_index_buffer *ib);
-
 enum u_vbuf_return_flags u_vbuf_draw_begin(struct u_vbuf *mgr,
                                            struct pipe_draw_info *info);
 
index b679592c0bf8078a6be990447aaf1f6154c28977..de582666ec9c7ab7afce2965a48cfbe2049a7bc9 100644 (file)
@@ -579,7 +579,7 @@ struct r300_context {
     void *dsa_decompress_zmask;
 
     struct u_vbuf *vbuf_mgr;
-    struct pipe_index_buffer swtcl_index_buffer;
+    struct pipe_index_buffer index_buffer;
     struct pipe_vertex_buffer swtcl_vertex_buffer[PIPE_MAX_ATTRIBS];
     unsigned swtcl_nr_vertex_buffers;
 
index 5981bec4023aa808f04ad5742488a3fb4a5bff36..49013c061b78e7062215909e65f909f714f5a1c6 100644 (file)
@@ -511,7 +511,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
     uint8_t *ptr1;
     uint16_t *ptr2;
     uint32_t *ptr4;
-    unsigned index_size = r300->vbuf_mgr->index_buffer.index_size;
+    unsigned index_size = r300->index_buffer.index_size;
     unsigned i, count_dwords = index_size == 4 ? info->count :
                                                  (info->count + 1) / 2;
     CS_LOCALS(r300);
@@ -529,7 +529,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
 
     switch (index_size) {
     case 1:
-        ptr1 = r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+        ptr1 = r300_resource(r300->index_buffer.buffer)->b.user_ptr;
         ptr1 += info->start;
 
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -553,7 +553,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
         break;
 
     case 2:
-        ptr2 = (uint16_t*)r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+        ptr2 = (uint16_t*)r300_resource(r300->index_buffer.buffer)->b.user_ptr;
         ptr2 += info->start;
 
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -572,7 +572,7 @@ static void r300_draw_elements_immediate(struct r300_context *r300,
         break;
 
     case 4:
-        ptr4 = (uint32_t*)r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr;
+        ptr4 = (uint32_t*)r300_resource(r300->index_buffer.buffer)->b.user_ptr;
         ptr4 += info->start;
 
         OUT_CS(R300_VAP_VF_CNTL__PRIM_WALK_INDICES | (info->count << 16) |
@@ -594,8 +594,8 @@ static void r300_draw_elements(struct r300_context *r300,
                                const struct pipe_draw_info *info,
                                int instance_id)
 {
-    struct pipe_resource *indexBuffer = r300->vbuf_mgr->index_buffer.buffer;
-    unsigned indexSize = r300->vbuf_mgr->index_buffer.index_size;
+    struct pipe_resource *indexBuffer = r300->index_buffer.buffer;
+    unsigned indexSize = r300->index_buffer.index_size;
     struct pipe_resource* orgIndexBuffer = indexBuffer;
     unsigned start = info->start;
     unsigned count = info->count;
@@ -746,7 +746,7 @@ static void r300_draw_vbo(struct pipe_context* pipe,
     struct r300_context* r300 = r300_context(pipe);
     struct pipe_draw_info info = *dinfo;
 
-    info.indexed = info.indexed && r300->vbuf_mgr->index_buffer.buffer;
+    info.indexed = info.indexed && r300->index_buffer.buffer;
 
     if (r300->skip_rendering ||
         !u_trim_pipe_prim(info.mode, &info.count)) {
@@ -776,11 +776,11 @@ static void r300_draw_vbo(struct pipe_context* pipe,
         }
 
         info.max_index = max_count - 1;
-        info.start += r300->vbuf_mgr->index_buffer.offset / r300->vbuf_mgr->index_buffer.index_size;
+        info.start += r300->index_buffer.offset / r300->index_buffer.index_size;
 
         if (info.instance_count <= 1) {
             if (info.count <= 8 &&
-                r300_resource(r300->vbuf_mgr->index_buffer.buffer)->b.user_ptr) {
+                r300_resource(r300->index_buffer.buffer)->b.user_ptr) {
                 r300_draw_elements_immediate(r300, &info);
             } else {
                 r300_draw_elements(r300, &info, -1);
@@ -818,7 +818,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
     struct pipe_transfer *ib_transfer = NULL;
     int i;
     void *indices = NULL;
-    boolean indexed = info->indexed && r300->swtcl_index_buffer.buffer;
+    boolean indexed = info->indexed && r300->index_buffer.buffer;
 
     if (r300->skip_rendering) {
         return;
@@ -843,7 +843,7 @@ static void r300_swtcl_draw_vbo(struct pipe_context* pipe,
     }
 
     if (indexed) {
-        indices = pipe_buffer_map(pipe, r300->swtcl_index_buffer.buffer,
+        indices = pipe_buffer_map(pipe, r300->index_buffer.buffer,
                                   PIPE_TRANSFER_READ |
                                   PIPE_TRANSFER_UNSYNCHRONIZED, &ib_transfer);
     }
index 10625b45e3e5c1c13762ed4aabec470ccb275c1b..ab5c18158d1530223ab2166aa88536d7f3b24427 100644 (file)
@@ -1618,15 +1618,14 @@ static void r300_set_index_buffer(struct pipe_context* pipe,
 {
     struct r300_context* r300 = r300_context(pipe);
 
-    if (r300->screen->caps.has_tcl) {
-        u_vbuf_set_index_buffer(r300->vbuf_mgr, ib);
+    if (ib) {
+        pipe_resource_reference(&r300->index_buffer.buffer, ib->buffer);
+        memcpy(&r300->index_buffer, ib, sizeof(*ib));
     } else {
-        if (ib) {
-            pipe_resource_reference(&r300->swtcl_index_buffer.buffer, ib->buffer);
-            memcpy(&r300->swtcl_index_buffer, ib, sizeof(*ib));
-        } else {
-            pipe_resource_reference(&r300->swtcl_index_buffer.buffer, NULL);
-        }
+        pipe_resource_reference(&r300->index_buffer.buffer, NULL);
+    }
+
+    if (!r300->screen->caps.has_tcl) {
         draw_set_index_buffer(r300->draw, ib);
     }
 }
index fd134fae0c6b75abda45d1ea284176578a4e5592..e49fbdf898ade091945f4288f6da9de70963d8a3 100644 (file)
@@ -353,6 +353,8 @@ struct r600_context {
        bool                    vertex_buffers_dirty;
        boolean                 dual_src_blend;
        unsigned color0_format;
+
+       struct pipe_index_buffer index_buffer;
 };
 
 static INLINE void r600_emit_atom(struct r600_context *rctx, struct r600_atom *atom)
index 706b00c77e5c3a733d2e3bd08a711b02e5765ecc..a2cf05def177a86a6ec14abdc3a0a63bcf8d9ab0 100644 (file)
@@ -382,13 +382,17 @@ void r600_delete_vertex_element(struct pipe_context *ctx, void *state)
        FREE(state);
 }
 
-
 void r600_set_index_buffer(struct pipe_context *ctx,
                           const struct pipe_index_buffer *ib)
 {
        struct r600_context *rctx = (struct r600_context *)ctx;
 
-       u_vbuf_set_index_buffer(rctx->vbuf_mgr, ib);
+       if (ib) {
+               pipe_resource_reference(&rctx->index_buffer.buffer, ib->buffer);
+               memcpy(&rctx->index_buffer, ib, sizeof(*ib));
+       } else {
+               pipe_resource_reference(&rctx->index_buffer.buffer, NULL);
+       }
 }
 
 void r600_set_vertex_buffers(struct pipe_context *ctx, unsigned count,
@@ -748,7 +752,7 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo)
        uint8_t *ptr;
 
        if ((!info.count && (info.indexed || !info.count_from_stream_output)) ||
-           (info.indexed && !rctx->vbuf_mgr->index_buffer.buffer) ||
+           (info.indexed && !rctx->index_buffer.buffer) ||
            !r600_conv_pipe_prim(info.mode, &prim)) {
                assert(0);
                return;
@@ -773,9 +777,9 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo)
 
        if (info.indexed) {
                /* Initialize the index buffer struct. */
-               pipe_resource_reference(&ib.buffer, rctx->vbuf_mgr->index_buffer.buffer);
-               ib.index_size = rctx->vbuf_mgr->index_buffer.index_size;
-               ib.offset = rctx->vbuf_mgr->index_buffer.offset + info.start * ib.index_size;
+               pipe_resource_reference(&ib.buffer, rctx->index_buffer.buffer);
+               ib.index_size = rctx->index_buffer.index_size;
+               ib.offset = rctx->index_buffer.offset + info.start * ib.index_size;
 
                /* Translate or upload, if needed. */
                r600_translate_index_buffer(rctx, &ib, info.count);