nv50,nvc0: implement blit
[mesa.git] / src / gallium / drivers / r600 / r600_buffer.c
index 27dddcc1cf7617ee039af0ee7535b6b2d27433c8..0b0ac3460e1bfb3fec66028a2fa3d7ea9e2fe5d9 100644 (file)
@@ -65,21 +65,25 @@ static struct pipe_transfer *r600_get_transfer(struct pipe_context *ctx,
 }
 
 static void r600_set_constants_dirty_if_bound(struct r600_context *rctx,
-                                             struct r600_constbuf_state *state,
                                              struct r600_resource *rbuffer)
 {
-       bool found = false;
-       uint32_t mask = state->enabled_mask;
-
-       while (mask) {
-               unsigned i = u_bit_scan(&mask);
-               if (state->cb[i].buffer == &rbuffer->b.b) {
-                       found = true;
-                       state->dirty_mask |= 1 << i;
+       unsigned shader;
+
+       for (shader = 0; shader < PIPE_SHADER_TYPES; shader++) {
+               struct r600_constbuf_state *state = &rctx->constbuf_state[shader];
+               bool found = false;
+               uint32_t mask = state->enabled_mask;
+
+               while (mask) {
+                       unsigned i = u_bit_scan(&mask);
+                       if (state->cb[i].buffer == &rbuffer->b.b) {
+                               found = true;
+                               state->dirty_mask |= 1 << i;
+                       }
+               }
+               if (found) {
+                       r600_constant_buffers_dirty(rctx, state);
                }
-       }
-       if (found) {
-               r600_constant_buffers_dirty(rctx, state);
        }
 }
 
@@ -126,10 +130,10 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
                                }
                        }
                        /* Constant buffers. */
-                       r600_set_constants_dirty_if_bound(rctx, &rctx->vs_constbuf_state, rbuffer);
-                       r600_set_constants_dirty_if_bound(rctx, &rctx->ps_constbuf_state, rbuffer);
+                       r600_set_constants_dirty_if_bound(rctx, rbuffer);
                }
        }
+#if 0 /* this is broken (see Bug 53130) */
        else if ((transfer->usage & PIPE_TRANSFER_DISCARD_RANGE) &&
                 !(transfer->usage & PIPE_TRANSFER_UNSYNCHRONIZED) &&
                 rctx->screen->has_streamout &&
@@ -149,6 +153,7 @@ static void *r600_buffer_transfer_map(struct pipe_context *pipe,
                        return rctx->ws->buffer_map(rtransfer->staging->cs_buf, rctx->cs, PIPE_TRANSFER_WRITE);
                }
        }
+#endif
 
        data = rctx->ws->buffer_map(rbuffer->cs_buf, rctx->cs, transfer->usage);
        if (!data)
@@ -235,12 +240,11 @@ bool r600_init_resource(struct r600_screen *rscreen,
 }
 
 struct pipe_resource *r600_buffer_create(struct pipe_screen *screen,
-                                        const struct pipe_resource *templ)
+                                        const struct pipe_resource *templ,
+                                        unsigned alignment)
 {
        struct r600_screen *rscreen = (struct r600_screen*)screen;
        struct r600_resource *rbuffer;
-       /* XXX We probably want a different alignment for buffers and textures. */
-       unsigned alignment = 4096;
 
        rbuffer = MALLOC_STRUCT(r600_resource);