Mesa (master): r300g: fix breakage after gallium-userbuf merge
Marek Olšák
mareko at kemper.freedesktop.org
Fri May 11 22:51:12 UTC 2012
Module: Mesa
Branch: master
Commit: bdba35befac74a0bef0d1be657e4e77de628e28b
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=bdba35befac74a0bef0d1be657e4e77de628e28b
Author: Marek Olšák <maraeo at gmail.com>
Date: Fri May 11 22:25:03 2012 +0200
r300g: fix breakage after gallium-userbuf merge
---
src/gallium/drivers/r300/r300_screen.c | 29 ++++++++++++++++++++---------
src/gallium/drivers/r300/r300_state.c | 21 ++++++++++++---------
2 files changed, 32 insertions(+), 18 deletions(-)
diff --git a/src/gallium/drivers/r300/r300_screen.c b/src/gallium/drivers/r300/r300_screen.c
index f84f3e5..1e7f927 100644
--- a/src/gallium/drivers/r300/r300_screen.c
+++ b/src/gallium/drivers/r300/r300_screen.c
@@ -103,9 +103,6 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_CAN_COMPACT_VARYINGS:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
case PIPE_CAP_VERTEX_COLOR_CLAMPED:
- case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
- case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_USER_CONSTANT_BUFFERS:
return 1;
@@ -149,13 +146,19 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
case PIPE_CAP_STREAM_OUTPUT_PAUSE_RESUME:
case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
- case PIPE_CAP_USER_VERTEX_BUFFERS:
return 0;
/* SWTCL-only features. */
case PIPE_CAP_PRIMITIVE_RESTART:
+ case PIPE_CAP_USER_VERTEX_BUFFERS:
return !r300screen->caps.has_tcl;
+ /* HWTCL-only features / limitations. */
+ case PIPE_CAP_VERTEX_BUFFER_OFFSET_4BYTE_ALIGNED_ONLY:
+ case PIPE_CAP_VERTEX_BUFFER_STRIDE_4BYTE_ALIGNED_ONLY:
+ case PIPE_CAP_VERTEX_ELEMENT_SRC_OFFSET_4BYTE_ALIGNED_ONLY:
+ return r300screen->caps.has_tcl;
+
/* Texturing. */
case PIPE_CAP_MAX_COMBINED_SAMPLERS:
return r300screen->caps.num_tex_units;
@@ -426,11 +429,19 @@ static boolean r300_is_format_supported(struct pipe_screen* screen,
}
/* Check vertex buffer format support. */
- if (usage & PIPE_BIND_VERTEX_BUFFER &&
- /* Half float is supported on >= R400. */
- (is_r400 || is_r500 || !is_half_float) &&
- r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
- retval |= PIPE_BIND_VERTEX_BUFFER;
+ if (usage & PIPE_BIND_VERTEX_BUFFER) {
+ if (r300_screen(screen)->caps.has_tcl) {
+ /* Half float is supported on >= R400. */
+ if ((is_r400 || is_r500 || !is_half_float) &&
+ r300_translate_vertex_data_type(format) != R300_INVALID_FORMAT) {
+ retval |= PIPE_BIND_VERTEX_BUFFER;
+ }
+ } else {
+ /* SW TCL */
+ if (!util_format_is_pure_integer(format)) {
+ retval |= PIPE_BIND_VERTEX_BUFFER;
+ }
+ }
}
/* Transfers are always supported. */
diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c
index 566bc44..a9a76c5 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -1822,11 +1822,12 @@ static void r300_set_constant_buffer(struct pipe_context *pipe,
struct pipe_constant_buffer *cb)
{
struct r300_context* r300 = r300_context(pipe);
- struct pipe_resource *buf = cb ? cb->buffer : NULL;
struct r300_constant_buffer *cbuf;
- struct r300_resource *rbuf = r300_resource(buf);
uint32_t *mapped;
+ if (!cb)
+ return;
+
switch (shader) {
case PIPE_SHADER_VERTEX:
cbuf = (struct r300_constant_buffer*)r300->vs_constants.state;
@@ -1838,15 +1839,17 @@ static void r300_set_constant_buffer(struct pipe_context *pipe,
return;
}
- if (buf == NULL || buf->width0 == 0)
- return;
if (cb->user_buffer)
mapped = (uint32_t*)cb->user_buffer;
- else if (rbuf->constant_buffer)
- mapped = (uint32_t*)rbuf->constant_buffer;
- else
- return;
+ else {
+ struct r300_resource *rbuf = r300_resource(cb->buffer);
+
+ if (rbuf && rbuf->constant_buffer)
+ mapped = (uint32_t*)rbuf->constant_buffer;
+ else
+ return;
+ }
if (shader == PIPE_SHADER_FRAGMENT ||
(shader == PIPE_SHADER_VERTEX && r300->screen->caps.has_tcl)) {
@@ -1873,7 +1876,7 @@ static void r300_set_constant_buffer(struct pipe_context *pipe,
r300_mark_atom_dirty(r300, &r300->vs_constants);
} else if (r300->draw) {
draw_set_mapped_constant_buffer(r300->draw, PIPE_SHADER_VERTEX,
- 0, mapped, buf->width0);
+ 0, mapped, cb->buffer_size);
}
} else if (shader == PIPE_SHADER_FRAGMENT) {
r300_mark_atom_dirty(r300, &r300->fs_constants);
More information about the mesa-commit
mailing list