Meta operations will setup vertices directly instead of interfering with core content vertex buffer object state.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=94181 Signed-off-by: Topi Pohjolainen <topi.pohjolai...@intel.com> --- src/mesa/drivers/dri/i965/brw_context.c | 2 + src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 57 +++++++++++++------------ 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 31b6b2a..e8c81c6 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -54,6 +54,7 @@ #include "brw_compiler.h" #include "brw_draw.h" #include "brw_state.h" +#include "brw_meta_util.h" #include "intel_batchbuffer.h" #include "intel_buffer_objects.h" @@ -952,6 +953,7 @@ brwCreateContext(gl_api api, } brw_init_state(brw); + brw_meta_init(brw); intelInitExtensions(ctx); diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c index 488fa6c..6a7cf4e 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c @@ -56,6 +56,7 @@ #include "intel_batchbuffer.h" #include "brw_blorp.h" +#include "brw_meta_util.h" struct brw_fast_clear_state { struct gl_buffer_object *buf_obj; @@ -176,6 +177,21 @@ brw_meta_fast_clear_free(struct brw_context *brw) _mesa_make_current(NULL, NULL, NULL); } +static void +set_render_buffers_state(struct brw_context *brw) +{ + struct gl_context *ctx = &brw->ctx; + struct gl_framebuffer *fb = ctx->DrawBuffer; + + for (unsigned i = 0; i < fb->_NumColorDrawBuffers; i++) { + struct intel_renderbuffer *irb = + intel_renderbuffer(fb->_ColorDrawBuffers[i]); + + if (irb) + brw_render_cache_set_add_bo(brw, irb->mt->bo); + } +} + struct rect { int x0, y0, x1, y1; }; @@ -184,41 +200,26 @@ static void brw_draw_rectlist(struct brw_context *brw, struct rect *rect, int num_instances) { struct gl_context *ctx = &brw->ctx; - struct brw_fast_clear_state *clear = brw->fast_clear_state; - int start = 0, count = 3; - struct _mesa_prim prim; - float verts[6]; - - verts[0] = rect->x1; - verts[1] = rect->y1; - verts[2] = rect->x0; - verts[3] = rect->y1; - verts[4] = rect->x0; - verts[5] = rect->y0; - - /* upload new vertex data */ - _mesa_buffer_data(ctx, clear->buf_obj, GL_NONE, sizeof(verts), verts, - GL_DYNAMIC_DRAW, __func__); if (ctx->NewState) _mesa_update_state(ctx); - vbo_bind_arrays(ctx); + brw_workaround_depthstencil_alignment(brw, 0); + +retry: + brw_meta_begin(brw, 3 * 1024 /* estimated_max_batch_usage */); + + brw_meta_pipeline_upload(brw, rect->x0, rect->y0, rect->x1, rect->y1); + + brw_meta_draw_rect(brw, num_instances); - memset(&prim, 0, sizeof prim); - prim.begin = 1; - prim.end = 1; - prim.mode = BRW_PRIM_OFFSET + _3DPRIM_RECTLIST; - prim.num_instances = num_instances; - prim.start = start; - prim.count = count; + if (!brw_meta_end(brw)) + goto retry; - /* Make sure our internal prim value doesn't clash with a valid GL value. */ - assert(!_mesa_is_valid_prim_mode(ctx, prim.mode)); + if (brw->ctx.NewDriverState) + brw_render_state_finished(brw); - brw_draw_prims(ctx, &prim, 1, NULL, - GL_TRUE, start, start + count - 1, - NULL, 0, NULL); + set_render_buffers_state(brw); } static void -- 2.5.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev