}
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);
}
}
}
}
/* 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 &&
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)
}
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);