浏览代码

r300g: fix rendering with no vertex elements

Fixes glsl-vs-point-size, although I meant to fix glsl-novertexdata.
Since swrast fails glsl-novertexdata too, I guess it's a core issue.
tags/android-x86-2.2
Marek Olšák 15 年前
父节点
当前提交
ffb732d8bd

+ 17
- 0
src/gallium/drivers/r300/r300_context.c 查看文件

@@ -79,6 +79,9 @@ static void r300_release_referenced_objects(struct r300_context *r300)
NULL);
}

/* The dummy VBO. */
pipe_resource_reference(&r300->dummy_vb, NULL);

/* The SWTCL VBO. */
pipe_resource_reference(&r300->vbo, NULL);

@@ -488,6 +491,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
rtempl.target = PIPE_TEXTURE_2D;
rtempl.format = PIPE_FORMAT_I8_UNORM;
rtempl.bind = PIPE_BIND_SAMPLER_VIEW;
rtempl.usage = PIPE_USAGE_IMMUTABLE;
rtempl.width0 = 1;
rtempl.height0 = 1;
rtempl.depth0 = 1;
@@ -501,6 +505,19 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
pipe_resource_reference(&tex, NULL);
}

{
struct pipe_resource vb = {};
vb.target = PIPE_BUFFER;
vb.format = PIPE_FORMAT_R8_UNORM;
vb.bind = PIPE_BIND_VERTEX_BUFFER;
vb.usage = PIPE_USAGE_IMMUTABLE;
vb.width0 = sizeof(float) * 16;
vb.height0 = 1;
vb.depth0 = 1;

r300->dummy_vb = screen->resource_create(screen, &vb);
}

return &r300->context;

fail:

+ 4
- 0
src/gallium/drivers/r300/r300_context.h 查看文件

@@ -480,6 +480,10 @@ struct r300_context {
* dummy texture there. */
struct r300_sampler_view *texkill_sampler;

/* When no vertex buffer is set, this one is used instead to prevent
* hardlocks. */
struct pipe_resource *dummy_vb;

/* The currently active query. */
struct r300_query *query_current;
/* The saved query for blitter operations. */

+ 0
- 4
src/gallium/drivers/r300/r300_render.c 查看文件

@@ -643,10 +643,6 @@ static void r300_draw_vbo(struct pipe_context* pipe,
return;
}

if (!r300->velems->count || !r300->vertex_buffer_count) {
return;
}

/* Index buffer range checking. */
if (indexed) {
assert(r300->index_buffer.offset % r300->index_buffer.index_size == 0);

+ 19
- 1
src/gallium/drivers/r300/r300_state.c 查看文件

@@ -1448,6 +1448,15 @@ static void r300_set_vertex_buffers(struct pipe_context* pipe,
struct pipe_vertex_buffer *vbo;
unsigned i, max_index = (1 << 24) - 1;
boolean any_user_buffer = FALSE;
struct pipe_vertex_buffer dummy_vb = {0};

/* There must be at least one vertex buffer set, otherwise it locks up. */
if (!count) {
dummy_vb.buffer = r300->dummy_vb;
dummy_vb.max_index = r300->dummy_vb->width0 / 4;
buffers = &dummy_vb;
count = 1;
}

if (count == r300->vertex_buffer_count &&
memcmp(r300->vertex_buffer, buffers,
@@ -1601,6 +1610,14 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
struct r300_vertex_element_state *velems;
unsigned i;
enum pipe_format *format;
struct pipe_vertex_element dummy_attrib = {0};

/* R300 Programmable Stream Control (PSC) doesn't support 0 vertex elements. */
if (!count) {
dummy_attrib.src_format = PIPE_FORMAT_R8G8B8A8_UNORM;
attribs = &dummy_attrib;
count = 1;
}

assert(count <= PIPE_MAX_ATTRIBS);
velems = CALLOC_STRUCT(r300_vertex_element_state);
@@ -1667,7 +1684,8 @@ static void* r300_create_vertex_elements_state(struct pipe_context* pipe,
* swizzles are already set up.
* Also compute the vertex size. */
for (i = 0; i < count; i++) {
/* This is OK because we check for aligned strides too. */
/* This is OK because we check for aligned strides too
* elsewhere. */
velems->hw_format_size[i] =
align(util_format_get_blocksize(velems->hw_format[i]), 4);
velems->vertex_size_dwords += velems->hw_format_size[i] / 4;

正在加载...
取消
保存