aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/util/u_blitter.c16
-rw-r--r--src/gallium/auxiliary/util/u_blitter.h2
-rw-r--r--src/gallium/drivers/v3d/v3d_context.c1
3 files changed, 17 insertions, 2 deletions
diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c
index 4748627fc52..eadb76a109f 100644
--- a/src/gallium/auxiliary/util/u_blitter.c
+++ b/src/gallium/auxiliary/util/u_blitter.c
@@ -1258,8 +1258,20 @@ static void blitter_draw(struct blitter_context_priv *ctx,
pipe->set_vertex_buffers(pipe, ctx->base.vb_slot, 1, &vb);
pipe->bind_vertex_elements_state(pipe, vertex_elements_cso);
pipe->bind_vs_state(pipe, get_vs(&ctx->base));
- util_draw_arrays_instanced(pipe, PIPE_PRIM_TRIANGLE_FAN, 0, 4,
- 0, num_instances);
+
+ if (ctx->base.use_index_buffer) {
+ /* Note that for V3D,
+ * dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_* require
+ * that the last vert of the two tris be the same.
+ */
+ static uint8_t indices[6] = { 0, 1, 2, 0, 3, 2 };
+ util_draw_elements_instanced(pipe, indices, 1, 0,
+ PIPE_PRIM_TRIANGLES, 0, 6,
+ 0, num_instances);
+ } else {
+ util_draw_arrays_instanced(pipe, PIPE_PRIM_TRIANGLE_FAN, 0, 4,
+ 0, num_instances);
+ }
pipe_resource_reference(&vb.buffer.resource, NULL);
}
diff --git a/src/gallium/auxiliary/util/u_blitter.h b/src/gallium/auxiliary/util/u_blitter.h
index 9e945983baa..9ea1dc9b6b2 100644
--- a/src/gallium/auxiliary/util/u_blitter.h
+++ b/src/gallium/auxiliary/util/u_blitter.h
@@ -100,6 +100,8 @@ struct blitter_context
/* Whether the blitter is running. */
bool running;
+ bool use_index_buffer;
+
/* Private members, really. */
struct pipe_context *pipe; /**< pipe context */
diff --git a/src/gallium/drivers/v3d/v3d_context.c b/src/gallium/drivers/v3d/v3d_context.c
index cef32ceb069..6fb807b1aa8 100644
--- a/src/gallium/drivers/v3d/v3d_context.c
+++ b/src/gallium/drivers/v3d/v3d_context.c
@@ -164,6 +164,7 @@ v3d_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags)
v3d->blitter = util_blitter_create(pctx);
if (!v3d->blitter)
goto fail;
+ v3d->blitter->use_index_buffer = true;
v3d->primconvert = util_primconvert_create(pctx,
(1 << PIPE_PRIM_QUADS) - 1);