---

I tested this patch with LLVM 3.4, 3.4.1, and 3.5 and observed the
correct behavior for all three versions.

 src/gallium/drivers/radeonsi/si_descriptors.c |  4 ++--
 src/gallium/drivers/radeonsi/si_pipe.c        |  4 ++--
 src/gallium/drivers/radeonsi/si_pipe.h        |  4 ++++
 src/gallium/drivers/radeonsi/si_state.c       | 10 +++++-----
 4 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c 
b/src/gallium/drivers/radeonsi/si_descriptors.c
index 0c58d5f..77bc034 100644
--- a/src/gallium/drivers/radeonsi/si_descriptors.c
+++ b/src/gallium/drivers/radeonsi/si_descriptors.c
@@ -152,7 +152,7 @@ static void si_update_descriptors(struct si_context *sctx,
                        7 + /* copy */
                        (4 + desc->element_dw_size) * 
util_bitcount(desc->dirty_mask) + /* update */
                        4; /* pointer update */
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
                if (desc->shader_userdata_reg >= 
R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
                    desc->shader_userdata_reg < 
R_00B230_SPI_SHADER_USER_DATA_GS_0)
                        desc->atom.num_dw += 4; /* second pointer update */
@@ -177,7 +177,7 @@ static void si_emit_shader_pointer(struct si_context *sctx,
        radeon_emit(cs, va);
        radeon_emit(cs, va >> 32);
 
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
        if (desc->shader_userdata_reg >= R_00B130_SPI_SHADER_USER_DATA_VS_0 &&
            desc->shader_userdata_reg < R_00B230_SPI_SHADER_USER_DATA_GS_0) {
                radeon_emit(cs, PKT3(PKT3_SET_SH_REG, 2, 0));
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index 24068e3..fc84bda 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -225,7 +225,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum 
pipe_cap param)
                return 4;
 
        case PIPE_CAP_GLSL_FEATURE_LEVEL:
-               return HAVE_LLVM >= 0x0305 ? 330 : 140;
+               return (LLVM_SUPPORTS_GEOM_SHADERS) ? 330 : 140;
 
        case PIPE_CAP_MAX_TEXTURE_BUFFER_SIZE:
                return MIN2(sscreen->b.info.vram_size, 0xFFFFFFFF);
@@ -308,7 +308,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, 
unsigned shader, enu
        case PIPE_SHADER_VERTEX:
                break;
        case PIPE_SHADER_GEOMETRY:
-#if HAVE_LLVM < 0x0305
+#if !(LLVM_SUPPORTS_GEOM_SHADERS)
                return 0;
 #endif
                break;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index a74bbcf..4a5f291 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -39,6 +39,10 @@
 
 #define SI_MAX_DRAW_CS_DWORDS 18
 
+#define LLVM_SUPPORTS_GEOM_SHADERS \
+       ((HAVE_LLVM >= 0x0305) || \
+       (HAVE_LLVM == 0x0304 && LLVM_VERSION_PATCH >= 1))
+
 struct si_pipe_compute;
 
 struct si_screen {
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index d25dc60..ab846b8 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2174,7 +2174,7 @@ static void *si_create_fs_state(struct pipe_context *ctx,
        return si_create_shader_state(ctx, state, PIPE_SHADER_FRAGMENT);
 }
 
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
 
 static void *si_create_gs_state(struct pipe_context *ctx,
                                const struct pipe_shader_state *state)
@@ -2204,7 +2204,7 @@ static void si_bind_vs_shader(struct pipe_context *ctx, 
void *state)
        sctx->vs_shader = sel;
 }
 
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
 
 static void si_bind_gs_shader(struct pipe_context *ctx, void *state)
 {
@@ -2272,7 +2272,7 @@ static void si_delete_vs_shader(struct pipe_context *ctx, 
void *state)
        si_delete_shader_selector(ctx, sel);
 }
 
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
 
 static void si_delete_gs_shader(struct pipe_context *ctx, void *state)
 {
@@ -2769,7 +2769,7 @@ static void si_bind_vs_sampler_states(struct pipe_context 
*ctx, unsigned count,
        si_set_sampler_states(sctx, pm4, count, states,
                              &sctx->samplers[PIPE_SHADER_VERTEX],
                              R_00B130_SPI_SHADER_USER_DATA_VS_0);
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
        si_set_sampler_states(sctx, pm4, count, states,
                              &sctx->samplers[PIPE_SHADER_VERTEX],
                              R_00B330_SPI_SHADER_USER_DATA_ES_0);
@@ -3001,7 +3001,7 @@ void si_init_state_functions(struct si_context *sctx)
        sctx->b.b.bind_fs_state = si_bind_ps_shader;
        sctx->b.b.delete_vs_state = si_delete_vs_shader;
        sctx->b.b.delete_fs_state = si_delete_ps_shader;
-#if HAVE_LLVM >= 0x0305
+#if LLVM_SUPPORTS_GEOM_SHADERS
        sctx->b.b.create_gs_state = si_create_gs_state;
        sctx->b.b.bind_gs_state = si_bind_gs_shader;
        sctx->b.b.delete_gs_state = si_delete_gs_shader;
-- 
1.8.1.5

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to