gallium: always save and restore vertex buffers using cso_cache
This commit is contained in:
@@ -81,6 +81,12 @@ struct cso_context {
|
||||
struct sampler_info fragment_samplers;
|
||||
struct sampler_info vertex_samplers;
|
||||
|
||||
uint nr_vertex_buffers;
|
||||
struct pipe_vertex_buffer vertex_buffers[PIPE_MAX_ATTRIBS];
|
||||
|
||||
uint nr_vertex_buffers_saved;
|
||||
struct pipe_vertex_buffer vertex_buffers_saved[PIPE_MAX_ATTRIBS];
|
||||
|
||||
/** Current and saved state.
|
||||
* The saved state is used as a 1-deep stack.
|
||||
*/
|
||||
@@ -312,6 +318,13 @@ void cso_release_all( struct cso_context *ctx )
|
||||
util_unreference_framebuffer_state(&ctx->fb);
|
||||
util_unreference_framebuffer_state(&ctx->fb_saved);
|
||||
|
||||
util_copy_vertex_buffers(ctx->vertex_buffers,
|
||||
&ctx->nr_vertex_buffers,
|
||||
NULL, 0);
|
||||
util_copy_vertex_buffers(ctx->vertex_buffers_saved,
|
||||
&ctx->nr_vertex_buffers_saved,
|
||||
NULL, 0);
|
||||
|
||||
if (ctx->cache) {
|
||||
cso_cache_delete( ctx->cache );
|
||||
ctx->cache = NULL;
|
||||
@@ -921,6 +934,38 @@ void cso_restore_vertex_elements(struct cso_context *ctx)
|
||||
ctx->velements_saved = NULL;
|
||||
}
|
||||
|
||||
/* vertex buffers */
|
||||
|
||||
void cso_set_vertex_buffers(struct cso_context *ctx,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_buffer *buffers)
|
||||
{
|
||||
if (count != ctx->nr_vertex_buffers ||
|
||||
memcmp(buffers, ctx->vertex_buffers,
|
||||
sizeof(struct pipe_vertex_buffer) * count) != 0) {
|
||||
util_copy_vertex_buffers(ctx->vertex_buffers, &ctx->nr_vertex_buffers,
|
||||
buffers, count);
|
||||
ctx->pipe->set_vertex_buffers(ctx->pipe, count, buffers);
|
||||
}
|
||||
}
|
||||
|
||||
void cso_save_vertex_buffers(struct cso_context *ctx)
|
||||
{
|
||||
util_copy_vertex_buffers(ctx->vertex_buffers_saved,
|
||||
&ctx->nr_vertex_buffers_saved,
|
||||
ctx->vertex_buffers,
|
||||
ctx->nr_vertex_buffers);
|
||||
}
|
||||
|
||||
void cso_restore_vertex_buffers(struct cso_context *ctx)
|
||||
{
|
||||
util_copy_vertex_buffers(ctx->vertex_buffers,
|
||||
&ctx->nr_vertex_buffers,
|
||||
ctx->vertex_buffers_saved,
|
||||
ctx->nr_vertex_buffers_saved);
|
||||
ctx->pipe->set_vertex_buffers(ctx->pipe, ctx->nr_vertex_buffers,
|
||||
ctx->vertex_buffers);
|
||||
}
|
||||
|
||||
|
||||
/**************** fragment/vertex sampler view state *************************/
|
||||
|
||||
@@ -110,6 +110,13 @@ void cso_save_vertex_elements(struct cso_context *ctx);
|
||||
void cso_restore_vertex_elements(struct cso_context *ctx);
|
||||
|
||||
|
||||
void cso_set_vertex_buffers(struct cso_context *ctx,
|
||||
unsigned count,
|
||||
const struct pipe_vertex_buffer *buffers);
|
||||
void cso_save_vertex_buffers(struct cso_context *ctx);
|
||||
void cso_restore_vertex_buffers(struct cso_context *ctx);
|
||||
|
||||
|
||||
/* These aren't really sensible -- most of the time the api provides
|
||||
* object semantics for shaders anyway, and the cases where it doesn't
|
||||
* (eg mesa's internall-generated texenv programs), it will be up to
|
||||
|
||||
@@ -480,6 +480,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
cso_save_clip(ctx->cso);
|
||||
cso_save_vertex_elements(ctx->cso);
|
||||
cso_save_vertex_buffers(ctx->cso);
|
||||
|
||||
/* set misc state we care about */
|
||||
cso_set_blend(ctx->cso, &ctx->blend);
|
||||
@@ -554,7 +555,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
s1, t1,
|
||||
z);
|
||||
|
||||
util_draw_vertex_buffer(ctx->pipe, ctx->vbuf, offset,
|
||||
util_draw_vertex_buffer(ctx->pipe, ctx->cso, ctx->vbuf, offset,
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
4, /* verts */
|
||||
2); /* attribs/vert */
|
||||
@@ -571,6 +572,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
cso_restore_clip(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
cso_restore_vertex_buffers(ctx->cso);
|
||||
|
||||
pipe_sampler_view_reference(&sampler_view, NULL);
|
||||
}
|
||||
@@ -672,6 +674,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
cso_save_clip(ctx->cso);
|
||||
cso_save_vertex_elements(ctx->cso);
|
||||
cso_save_vertex_buffers(ctx->cso);
|
||||
|
||||
/* set misc state we care about */
|
||||
cso_set_blend(ctx->cso, &ctx->blend);
|
||||
@@ -722,7 +725,7 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
s0, t0, s1, t1,
|
||||
z);
|
||||
|
||||
util_draw_vertex_buffer(ctx->pipe,
|
||||
util_draw_vertex_buffer(ctx->pipe, ctx->cso,
|
||||
ctx->vbuf, offset,
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
4, /* verts */
|
||||
@@ -740,4 +743,5 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
cso_restore_clip(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
cso_restore_vertex_buffers(ctx->cso);
|
||||
}
|
||||
|
||||
@@ -639,7 +639,7 @@ static void blitter_draw_rectangle(struct blitter_context *blitter,
|
||||
}
|
||||
|
||||
blitter_set_rectangle(ctx, x1, y1, x2, y2, depth);
|
||||
util_draw_vertex_buffer(ctx->base.pipe, ctx->vbuf, 0,
|
||||
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
|
||||
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||
}
|
||||
|
||||
@@ -867,7 +867,7 @@ void util_blitter_copy_region(struct blitter_context *blitter,
|
||||
|
||||
/* Draw. */
|
||||
blitter_set_rectangle(ctx, dstx, dsty, dstx+width, dsty+height, 0);
|
||||
util_draw_vertex_buffer(ctx->base.pipe, ctx->vbuf, 0,
|
||||
util_draw_vertex_buffer(ctx->base.pipe, NULL, ctx->vbuf, 0,
|
||||
PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||
break;
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "util/u_inlines.h"
|
||||
#include "util/u_draw_quad.h"
|
||||
#include "util/u_memory.h"
|
||||
#include "cso_cache/cso_context.h"
|
||||
|
||||
|
||||
/**
|
||||
@@ -39,6 +40,7 @@
|
||||
*/
|
||||
void
|
||||
util_draw_vertex_buffer(struct pipe_context *pipe,
|
||||
struct cso_context *cso,
|
||||
struct pipe_resource *vbuf,
|
||||
uint offset,
|
||||
uint prim_type,
|
||||
@@ -55,7 +57,12 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
|
||||
vbuffer.stride = num_attribs * 4 * sizeof(float); /* vertex size */
|
||||
vbuffer.buffer_offset = offset;
|
||||
vbuffer.max_index = num_verts - 1;
|
||||
pipe->set_vertex_buffers(pipe, 1, &vbuffer);
|
||||
|
||||
if (cso) {
|
||||
cso_set_vertex_buffers(cso, 1, &vbuffer);
|
||||
} else {
|
||||
pipe->set_vertex_buffers(pipe, 1, &vbuffer);
|
||||
}
|
||||
|
||||
/* note: vertex elements already set by caller */
|
||||
|
||||
@@ -70,7 +77,7 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
|
||||
* Note: this isn't especially efficient.
|
||||
*/
|
||||
void
|
||||
util_draw_texquad(struct pipe_context *pipe,
|
||||
util_draw_texquad(struct pipe_context *pipe, struct cso_context *cso,
|
||||
float x0, float y0, float x1, float y1, float z)
|
||||
{
|
||||
uint numAttribs = 2, i, j;
|
||||
@@ -118,7 +125,7 @@ util_draw_texquad(struct pipe_context *pipe,
|
||||
if (!vbuf)
|
||||
goto out;
|
||||
|
||||
util_draw_vertex_buffer(pipe, vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||
util_draw_vertex_buffer(pipe, cso, vbuf, 0, PIPE_PRIM_TRIANGLE_FAN, 4, 2);
|
||||
|
||||
out:
|
||||
if (vbuf)
|
||||
|
||||
@@ -38,17 +38,18 @@ extern "C" {
|
||||
#endif
|
||||
|
||||
struct pipe_resource;
|
||||
struct cso_context;
|
||||
|
||||
#include "util/u_draw.h"
|
||||
|
||||
extern void
|
||||
util_draw_vertex_buffer(struct pipe_context *pipe,
|
||||
util_draw_vertex_buffer(struct pipe_context *pipe, struct cso_context *cso,
|
||||
struct pipe_resource *vbuf, uint offset,
|
||||
uint num_attribs, uint num_verts, uint prim_type);
|
||||
|
||||
|
||||
extern void
|
||||
util_draw_texquad(struct pipe_context *pipe,
|
||||
util_draw_texquad(struct pipe_context *pipe, struct cso_context *cso,
|
||||
float x0, float y0, float x1, float y1, float z);
|
||||
|
||||
|
||||
|
||||
@@ -1616,7 +1616,8 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
||||
face,
|
||||
rcoord);
|
||||
|
||||
util_draw_vertex_buffer(ctx->pipe,
|
||||
util_draw_vertex_buffer(ctx->pipe,
|
||||
ctx->cso,
|
||||
ctx->vbuf,
|
||||
offset,
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
|
||||
@@ -572,7 +572,7 @@ static void renderer_quad_draw(struct renderer *r)
|
||||
sizeof(r->vertices),
|
||||
PIPE_BIND_VERTEX_BUFFER);
|
||||
if (buf) {
|
||||
util_draw_vertex_buffer(r->pipe, buf, 0,
|
||||
util_draw_vertex_buffer(r->pipe, r->cso, buf, 0,
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
Elements(r->vertices), /* verts */
|
||||
Elements(r->vertices[0])); /* attribs/vert */
|
||||
@@ -1050,7 +1050,7 @@ void renderer_polygon_stencil(struct renderer *renderer,
|
||||
{
|
||||
assert(renderer->state == RENDERER_STATE_POLYGON_STENCIL);
|
||||
|
||||
renderer->pipe->set_vertex_buffers(renderer->pipe, 1, vbuf);
|
||||
cso_set_vertex_buffers(renderer->cso, 1, vbuf);
|
||||
|
||||
if (!renderer->u.polygon_stencil.manual_two_sides) {
|
||||
util_draw_arrays(renderer->pipe, mode, start, count);
|
||||
|
||||
@@ -73,7 +73,7 @@ renderer_draw(struct xorg_renderer *r)
|
||||
if (buf) {
|
||||
cso_set_vertex_elements(r->cso, r->attrs_per_vertex, r->velems);
|
||||
|
||||
util_draw_vertex_buffer(pipe, buf, 0,
|
||||
util_draw_vertex_buffer(pipe, r->cso, buf, 0,
|
||||
PIPE_PRIM_QUADS,
|
||||
num_verts, /* verts */
|
||||
r->attrs_per_vertex); /* attribs/vert */
|
||||
@@ -616,7 +616,7 @@ void renderer_draw_yuv(struct xorg_renderer *r,
|
||||
|
||||
cso_set_vertex_elements(r->cso, num_attribs, r->velems);
|
||||
|
||||
util_draw_vertex_buffer(pipe, buf, 0,
|
||||
util_draw_vertex_buffer(pipe, r->cso, buf, 0,
|
||||
PIPE_PRIM_QUADS,
|
||||
4, /* verts */
|
||||
num_attribs); /* attribs/vert */
|
||||
|
||||
@@ -456,6 +456,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
||||
cso_save_fragment_shader(cso);
|
||||
cso_save_vertex_shader(cso);
|
||||
cso_save_vertex_elements(cso);
|
||||
cso_save_vertex_buffers(cso);
|
||||
|
||||
/* rasterizer state: just scissor */
|
||||
st->bitmap.rasterizer.scissor = ctx->Scissor.Enabled;
|
||||
@@ -517,7 +518,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
||||
sv->texture->target != PIPE_TEXTURE_RECT,
|
||||
x, y, width, height, z, color);
|
||||
|
||||
util_draw_vertex_buffer(pipe, st->bitmap.vbuf, offset,
|
||||
util_draw_vertex_buffer(pipe, st->cso_context, st->bitmap.vbuf, offset,
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
4, /* verts */
|
||||
3); /* attribs/vert */
|
||||
@@ -531,6 +532,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
||||
cso_restore_fragment_shader(cso);
|
||||
cso_restore_vertex_shader(cso);
|
||||
cso_restore_vertex_elements(cso);
|
||||
cso_restore_vertex_buffers(cso);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -172,7 +172,8 @@ draw_quad(struct st_context *st,
|
||||
st->clear.vertices);
|
||||
|
||||
/* draw */
|
||||
util_draw_vertex_buffer(pipe,
|
||||
util_draw_vertex_buffer(pipe,
|
||||
st->cso_context,
|
||||
st->clear.vbuf,
|
||||
st->clear.vbuf_slot * sizeof(st->clear.vertices),
|
||||
PIPE_PRIM_TRIANGLE_FAN,
|
||||
@@ -221,6 +222,7 @@ clear_with_quad(struct gl_context *ctx,
|
||||
cso_save_fragment_shader(st->cso_context);
|
||||
cso_save_vertex_shader(st->cso_context);
|
||||
cso_save_vertex_elements(st->cso_context);
|
||||
cso_save_vertex_buffers(st->cso_context);
|
||||
|
||||
/* blend state: RGBA masking */
|
||||
{
|
||||
@@ -309,6 +311,7 @@ clear_with_quad(struct gl_context *ctx,
|
||||
cso_restore_fragment_shader(st->cso_context);
|
||||
cso_restore_vertex_shader(st->cso_context);
|
||||
cso_restore_vertex_elements(st->cso_context);
|
||||
cso_restore_vertex_buffers(st->cso_context);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -525,7 +525,7 @@ draw_quad(struct gl_context *ctx, GLfloat x0, GLfloat y0, GLfloat z,
|
||||
sizeof(verts));
|
||||
pipe_buffer_write(st->pipe, buf, 0, sizeof(verts), verts);
|
||||
|
||||
util_draw_vertex_buffer(pipe, buf, 0,
|
||||
util_draw_vertex_buffer(pipe, st->cso_context, buf, 0,
|
||||
PIPE_PRIM_QUADS,
|
||||
4, /* verts */
|
||||
3); /* attribs/vert */
|
||||
@@ -570,6 +570,7 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
||||
cso_save_fragment_shader(cso);
|
||||
cso_save_vertex_shader(cso);
|
||||
cso_save_vertex_elements(cso);
|
||||
cso_save_vertex_buffers(cso);
|
||||
if (write_stencil) {
|
||||
cso_save_depth_stencil_alpha(cso);
|
||||
cso_save_blend(cso);
|
||||
@@ -686,6 +687,7 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
|
||||
cso_restore_fragment_shader(cso);
|
||||
cso_restore_vertex_shader(cso);
|
||||
cso_restore_vertex_elements(cso);
|
||||
cso_restore_vertex_buffers(cso);
|
||||
if (write_stencil) {
|
||||
cso_restore_depth_stencil_alpha(cso);
|
||||
cso_restore_blend(cso);
|
||||
|
||||
@@ -230,6 +230,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
|
||||
cso_save_viewport(cso);
|
||||
cso_save_vertex_shader(cso);
|
||||
cso_save_vertex_elements(cso);
|
||||
cso_save_vertex_buffers(cso);
|
||||
|
||||
{
|
||||
void *vs = lookup_shader(pipe, numAttribs,
|
||||
@@ -277,6 +278,7 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z,
|
||||
cso_restore_viewport(cso);
|
||||
cso_restore_vertex_shader(cso);
|
||||
cso_restore_vertex_elements(cso);
|
||||
cso_restore_vertex_buffers(cso);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -709,7 +709,7 @@ st_draw_vbo(struct gl_context *ctx,
|
||||
}
|
||||
#endif
|
||||
|
||||
pipe->set_vertex_buffers(pipe, num_vbuffers, vbuffer);
|
||||
cso_set_vertex_buffers(st->cso_context, num_vbuffers, vbuffer);
|
||||
cso_set_vertex_elements(st->cso_context, num_velements, velements);
|
||||
|
||||
setup_index_buffer(ctx, ib, &ibuffer);
|
||||
|
||||
Reference in New Issue
Block a user