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

Reply via email to