Hi Marek, Yea I don't let git send emails via any mailer.. It would be better if I could just do pull requests rather than mailing lists if at all possible? I really seriously hate mailing lists.
In any case, attached is a revised patch with all the feedback included. Kind Regards, Edward. -- Edward O'Callaghan edward.ocallag...@koparo.com On Tue, Jul 28, 2015, at 09:26 PM, Marek Olšák wrote: > Hi Edward, > > please use git send-email next time. Now I have to paste your patch here. > > > diff --git a/docs/GL3.txt b/docs/GL3.txt > index 15bb57f..6d9d424 100644 > --- a/docs/GL3.txt > +++ b/docs/GL3.txt > @@ -189,7 +189,7 @@ GL 4.5, GLSL 4.50: > > GL_ARB_ES3_1_compatibility not started > GL_ARB_clip_control DONE (i965, > nv50, nvc0, r600, radeonsi, llvmpipe, softpipe) > - GL_ARB_conditional_render_inverted DONE (i965, > nv50, nvc0, llvmpipe, softpipe) > + GL_ARB_conditional_render_inverted DONE (i965, > nv50, nvc0, r600, radeonsi, llvmpipe, softpipe) > > You forgot to expose the PIPE_CAP for r600 (in r600_pipe.c). > > Also please update the release notes as well (docs/relnotes/10.7.html). > > > GL_ARB_cull_distance in progress > (Tobias) > GL_ARB_derivative_control DONE (i965, > nv50, nvc0, r600, radeonsi) > GL_ARB_direct_state_access DONE (all > drivers) > diff --git a/src/gallium/drivers/radeon/r600_query.c > b/src/gallium/drivers/radeon/r600_query.c > index a1d8241..33ffe76 100644 > --- a/src/gallium/drivers/radeon/r600_query.c > +++ b/src/gallium/drivers/radeon/r600_query.c > @@ -290,45 +290,57 @@ static void r600_emit_query_predication(struct > r600_common_context *ctx, struct > int operation, bool flag_wait) > { > struct radeon_winsys_cs *cs = ctx->rings.gfx.cs; > + struct r600_query_buffer *qbuf; > + unsigned count; > + uint32_t op = PRED_OP(operation); > + > + // if true then invert, see GL_ARB_conditional_render_inverted > > C++ comments are not allowed. > > > + if (ctx->current_render_cond_cond) > + op |= PREDICATION_DRAW_NOT_VISIBLE; // Draw if not > visable/overflow > + else > + op |= PREDICATION_DRAW_VISIBLE; // Draw if visable/overflow > > - if (operation == PREDICATION_OP_CLEAR) { > + switch (operation) { > + case PREDICATION_OP_ZPASS: // query->type == > PIPE_QUERY_OCCLUSION_PREDICATE > + break; > + case PREDICATION_OP_PRIMCOUNT: // query->type == > PIPE_QUERY_SO_OVERFLOW_PREDICATE > + break; > + case PREDICATION_OP_CLEAR: > > Please keep the if statement here instead of the switch. > > > ctx->need_gfx_cs_space(&ctx->b, 3, FALSE); > > radeon_emit(cs, PKT3(PKT3_SET_PREDICATION, 1, 0)); > radeon_emit(cs, 0); > radeon_emit(cs, PRED_OP(PREDICATION_OP_CLEAR)); > - } else { > - struct r600_query_buffer *qbuf; > - unsigned count; > - uint32_t op; > - > - /* Find how many results there are. */ > - count = 0; > - for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { > - count += qbuf->results_end / query->result_size; > - } > + return; > + default: > + break; > + } > > The following cleanup should be in a separate patch. > > - ctx->need_gfx_cs_space(&ctx->b, 5 * count, TRUE); > + /* Find how many results there are. */ > + count = 0; > + for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { > + count += qbuf->results_end / query->result_size; > + } > > - op = PRED_OP(operation) | PREDICATION_DRAW_VISIBLE | > - (flag_wait ? PREDICATION_HINT_WAIT : > PREDICATION_HINT_NOWAIT_DRAW); > + ctx->need_gfx_cs_space(&ctx->b, 5 * count, TRUE); > > - /* emit predicate packets for all data blocks */ > - for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { > - unsigned results_base = 0; > - uint64_t va = qbuf->buf->gpu_address; > + op |= flag_wait ? PREDICATION_HINT_WAIT : > PREDICATION_HINT_NOWAIT_DRAW; > > - while (results_base < qbuf->results_end) { > - radeon_emit(cs, PKT3(PKT3_SET_PREDICATION, 1, 0)); > - radeon_emit(cs, (va + results_base) & 0xFFFFFFFFUL); > - radeon_emit(cs, op | (((va + results_base) >> 32UL) & > 0xFF)); > - r600_emit_reloc(ctx, &ctx->rings.gfx, qbuf->buf, > RADEON_USAGE_READ, > - RADEON_PRIO_MIN); > - results_base += query->result_size; > + /* emit predicate packets for all data blocks */ > + for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { > + unsigned results_base = 0; > + uint64_t va = qbuf->buf->gpu_address; > > - /* set CONTINUE bit for all packets except the first */ > - op |= PREDICATION_CONTINUE; > - } > + while (results_base < qbuf->results_end) { > + radeon_emit(cs, PKT3(PKT3_SET_PREDICATION, 1, 0)); > + radeon_emit(cs, (va + results_base) & 0xFFFFFFFFUL); > + radeon_emit(cs, op | (((va + results_base) >> 32UL) & > 0xFF)); > + r600_emit_reloc(ctx, &ctx->rings.gfx, qbuf->buf, > RADEON_USAGE_READ, > + RADEON_PRIO_MIN); > + results_base += query->result_size; > + > + /* set CONTINUE bit for all packets except the first */ > + op |= PREDICATION_CONTINUE; > } > } > } > diff --git a/src/gallium/drivers/radeonsi/si_pipe.c > b/src/gallium/drivers/radeonsi/si_pipe.c > index ebe1f5a..808b9bc 100644 > --- a/src/gallium/drivers/radeonsi/si_pipe.c > +++ b/src/gallium/drivers/radeonsi/si_pipe.c > @@ -250,6 +250,7 @@ static int si_get_param(struct pipe_screen* > pscreen, enum pipe_cap param) > case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: > case PIPE_CAP_TGSI_TEXCOORD: > case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: > + case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: > return 1; > > case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: > @@ -290,7 +291,6 @@ static int si_get_param(struct pipe_screen* > pscreen, enum pipe_cap param) > case PIPE_CAP_USER_VERTEX_BUFFERS: > case PIPE_CAP_FAKE_SW_MSAA: > case PIPE_CAP_TEXTURE_GATHER_OFFSETS: > - case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: > case PIPE_CAP_SAMPLER_VIEW_TARGET: > case PIPE_CAP_VERTEXID_NOBASE: > return 0; > -- > 2.4.3 > > Marek
From abf9c75b453a6ce48569617b03fdd11fe29c37ef Mon Sep 17 00:00:00 2001 From: Edward O'Callaghan <eocallag...@alterapraxis.com> Date: Mon, 27 Jul 2015 11:01:47 +1000 Subject: [PATCH] r600,radeonsi: GL_ARB_conditional_render_inverted By using 'Tobias Klausmann' piglit test-suite patch. We obtain a full 12/12 passes using this patch. By 'faking' to claim support for this extension we obtain 7 fails and 5 passes. Signed-off-by: Edward O'Callaghan <eocallag...@alterapraxis.com> Tested-by: Furkan Alaca <fal...@gmail.com> --- docs/GL3.txt | 2 +- docs/relnotes/10.7.0.html | 1 + src/gallium/drivers/r600/r600_pipe.c | 2 +- src/gallium/drivers/radeon/r600_query.c | 22 +++++++++++++--------- src/gallium/drivers/radeonsi/si_pipe.c | 2 +- 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/GL3.txt b/docs/GL3.txt index 15bb57f..6d9d424 100644 --- a/docs/GL3.txt +++ b/docs/GL3.txt @@ -189,7 +189,7 @@ GL 4.5, GLSL 4.50: GL_ARB_ES3_1_compatibility not started GL_ARB_clip_control DONE (i965, nv50, nvc0, r600, radeonsi, llvmpipe, softpipe) - GL_ARB_conditional_render_inverted DONE (i965, nv50, nvc0, llvmpipe, softpipe) + GL_ARB_conditional_render_inverted DONE (i965, nv50, nvc0, r600, radeonsi, llvmpipe, softpipe) GL_ARB_cull_distance in progress (Tobias) GL_ARB_derivative_control DONE (i965, nv50, nvc0, r600, radeonsi) GL_ARB_direct_state_access DONE (all drivers) diff --git a/docs/relnotes/10.7.0.html b/docs/relnotes/10.7.0.html index afef525..2df18c0 100644 --- a/docs/relnotes/10.7.0.html +++ b/docs/relnotes/10.7.0.html @@ -45,6 +45,7 @@ Note: some of the new features are only available with certain drivers. <ul> <li>GL_AMD_vertex_shader_viewport_index on radeonsi</li> +<li>GL_ARB_conditional_render_inverted on r600, radeonsi</li> <li>GL_ARB_derivative_control on radeonsi</li> <li>GL_ARB_fragment_layer_viewport on radeonsi</li> <li>GL_ARB_framebuffer_no_attachments on i965</li> diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index e845928..e755784 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -268,6 +268,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_SAMPLE_SHADING: case PIPE_CAP_CLIP_HALFZ: case PIPE_CAP_POLYGON_OFFSET_CLAMP: + case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: return 1; case PIPE_CAP_DEVICE_RESET_STATUS_QUERY: @@ -332,7 +333,6 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_VERTEX_COLOR_CLAMPED: case PIPE_CAP_USER_VERTEX_BUFFERS: case PIPE_CAP_TEXTURE_GATHER_OFFSETS: - case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: case PIPE_CAP_SAMPLER_VIEW_TARGET: case PIPE_CAP_VERTEXID_NOBASE: case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS: diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index a1d8241..6bf0271 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -290,6 +290,13 @@ static void r600_emit_query_predication(struct r600_common_context *ctx, struct int operation, bool flag_wait) { struct radeon_winsys_cs *cs = ctx->rings.gfx.cs; + uint32_t op = PRED_OP(operation); + + /* if true then invert, see GL_ARB_conditional_render_inverted */ + if (ctx->current_render_cond_cond) + op |= PREDICATION_DRAW_NOT_VISIBLE; /* Draw if not visable/overflow */ + else + op |= PREDICATION_DRAW_VISIBLE; /* Draw if visable/overflow */ if (operation == PREDICATION_OP_CLEAR) { ctx->need_gfx_cs_space(&ctx->b, 3, FALSE); @@ -300,24 +307,21 @@ static void r600_emit_query_predication(struct r600_common_context *ctx, struct } else { struct r600_query_buffer *qbuf; unsigned count; - uint32_t op; - /* Find how many results there are. */ count = 0; for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { count += qbuf->results_end / query->result_size; } - + ctx->need_gfx_cs_space(&ctx->b, 5 * count, TRUE); - - op = PRED_OP(operation) | PREDICATION_DRAW_VISIBLE | - (flag_wait ? PREDICATION_HINT_WAIT : PREDICATION_HINT_NOWAIT_DRAW); - + + op |= flag_wait ? PREDICATION_HINT_WAIT : PREDICATION_HINT_NOWAIT_DRAW; + /* emit predicate packets for all data blocks */ for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) { unsigned results_base = 0; uint64_t va = qbuf->buf->gpu_address; - + while (results_base < qbuf->results_end) { radeon_emit(cs, PKT3(PKT3_SET_PREDICATION, 1, 0)); radeon_emit(cs, (va + results_base) & 0xFFFFFFFFUL); @@ -325,7 +329,7 @@ static void r600_emit_query_predication(struct r600_common_context *ctx, struct r600_emit_reloc(ctx, &ctx->rings.gfx, qbuf->buf, RADEON_USAGE_READ, RADEON_PRIO_MIN); results_base += query->result_size; - + /* set CONTINUE bit for all packets except the first */ op |= PREDICATION_CONTINUE; } diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index ebe1f5a..808b9bc 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -250,6 +250,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION: case PIPE_CAP_TGSI_TEXCOORD: case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: + case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: return 1; case PIPE_CAP_RESOURCE_FROM_USER_MEMORY: @@ -290,7 +291,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param) case PIPE_CAP_USER_VERTEX_BUFFERS: case PIPE_CAP_FAKE_SW_MSAA: case PIPE_CAP_TEXTURE_GATHER_OFFSETS: - case PIPE_CAP_CONDITIONAL_RENDER_INVERTED: case PIPE_CAP_SAMPLER_VIEW_TARGET: case PIPE_CAP_VERTEXID_NOBASE: return 0; -- 2.4.3
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev