gallivm: add gather support to sampler interface
authorRoland Scheidegger <sroland@vmware.com>
Sun, 29 Mar 2015 21:21:56 +0000 (23:21 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Tue, 31 Mar 2015 15:23:51 +0000 (17:23 +0200)
Luckily thanks to the revamped interface this is a lot less work now...

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_sample.h
src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c

index b95ee6fb56fe360b2542a7b4145b4a30dbb10fc8..640b7e0d7e037665f89c13ef271ac093939053ad 100644 (file)
@@ -76,13 +76,21 @@ enum lp_sampler_lod_control {
 };
 
 
+enum lp_sampler_op_type {
+   LP_SAMPLER_OP_TEXTURE,
+   LP_SAMPLER_OP_FETCH,
+   LP_SAMPLER_OP_GATHER
+};
+
+
 #define LP_SAMPLER_SHADOW             (1 << 0)
 #define LP_SAMPLER_OFFSETS            (1 << 1)
-#define LP_SAMPLER_FETCH              (1 << 2)
-#define LP_SAMPLER_LOD_CONTROL_SHIFT        3
-#define LP_SAMPLER_LOD_CONTROL_MASK   (3 << 3)
-#define LP_SAMPLER_LOD_PROPERTY_SHIFT       5
-#define LP_SAMPLER_LOD_PROPERTY_MASK  (3 << 5)
+#define LP_SAMPLER_OP_TYPE_SHIFT            2
+#define LP_SAMPLER_OP_TYPE_MASK       (3 << 2)
+#define LP_SAMPLER_LOD_CONTROL_SHIFT        4
+#define LP_SAMPLER_LOD_CONTROL_MASK   (3 << 4)
+#define LP_SAMPLER_LOD_PROPERTY_SHIFT       6
+#define LP_SAMPLER_LOD_PROPERTY_MASK  (3 << 6)
 
 struct lp_sampler_params
 {
index 82ef359ed303138f7af6e7e3b39b4c9f7811c8b1..962f478f56804f0215599c6df4fdfa7217f43711 100644 (file)
@@ -2391,9 +2391,10 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
    LLVMValueRef tex_width, newcoords[5];
    enum lp_sampler_lod_property lod_property;
    enum lp_sampler_lod_control lod_control;
+   enum lp_sampler_op_type op_type;
    LLVMValueRef lod_bias = NULL;
    LLVMValueRef explicit_lod = NULL;
-   boolean is_fetch = !!(sample_key & LP_SAMPLER_FETCH);
+   boolean op_is_tex;
 
    if (0) {
       enum pipe_format fmt = static_texture_state->format;
@@ -2404,6 +2405,10 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
                      LP_SAMPLER_LOD_PROPERTY_SHIFT;
    lod_control = (sample_key & LP_SAMPLER_LOD_CONTROL_MASK) >>
                     LP_SAMPLER_LOD_CONTROL_SHIFT;
+   op_type = (sample_key & LP_SAMPLER_OP_TYPE_MASK) >>
+                 LP_SAMPLER_OP_TYPE_SHIFT;
+
+   op_is_tex = op_type == LP_SAMPLER_OP_TEXTURE;
 
    if (lod_control == LP_SAMPLER_LOD_BIAS) {
       lod_bias = lod;
@@ -2534,7 +2539,7 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
        (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) &&
        (static_texture_state->target == PIPE_TEXTURE_CUBE ||
         static_texture_state->target == PIPE_TEXTURE_CUBE_ARRAY) &&
-       (!is_fetch && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
+       (op_is_tex && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
       /*
        * special case for using per-pixel lod even for implicit lod,
        * which is generally never required (ok by APIs) except to please
@@ -2548,23 +2553,23 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
    }
    else if (lod_property == LP_SAMPLER_LOD_PER_ELEMENT ||
        (explicit_lod || lod_bias || derivs)) {
-      if ((is_fetch && target != PIPE_BUFFER) ||
-          (!is_fetch && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
+      if ((!op_is_tex && target != PIPE_BUFFER) ||
+          (op_is_tex && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
          bld.num_mips = type.length;
          bld.num_lods = type.length;
       }
-      else if (!is_fetch && min_img_filter != mag_img_filter) {
+      else if (op_is_tex && min_img_filter != mag_img_filter) {
          bld.num_mips = 1;
          bld.num_lods = type.length;
       }
    }
    /* TODO: for true scalar_lod should only use 1 lod value */
-   else if ((is_fetch && explicit_lod && target != PIPE_BUFFER) ||
-            (!is_fetch && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
+   else if ((!op_is_tex && explicit_lod && target != PIPE_BUFFER) ||
+            (op_is_tex && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
       bld.num_mips = num_quads;
       bld.num_lods = num_quads;
    }
-   else if (!is_fetch && min_img_filter != mag_img_filter) {
+   else if (op_is_tex && min_img_filter != mag_img_filter) {
       bld.num_mips = 1;
       bld.num_lods = num_quads;
    }
@@ -2658,7 +2663,7 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
                           texel_out);
    }
 
-   else if (is_fetch) {
+   else if (op_type == LP_SAMPLER_OP_FETCH) {
       lp_build_fetch_texel(&bld, texture_index, newcoords,
                            lod, offsets,
                            texel_out);
@@ -2786,18 +2791,18 @@ lp_build_sample_soa_code(struct gallivm_state *gallivm,
              (gallivm_debug & GALLIVM_DEBUG_NO_RHO_APPROX) &&
              (static_texture_state->target == PIPE_TEXTURE_CUBE ||
               static_texture_state->target == PIPE_TEXTURE_CUBE_ARRAY) &&
-             (!is_fetch && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
+             (op_is_tex && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
             bld4.num_mips = type4.length;
             bld4.num_lods = type4.length;
          }
          if (lod_property == LP_SAMPLER_LOD_PER_ELEMENT &&
              (explicit_lod || lod_bias || derivs)) {
-            if ((is_fetch && target != PIPE_BUFFER) ||
-                (!is_fetch && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
+            if ((!op_is_tex && target != PIPE_BUFFER) ||
+                (op_is_tex && mip_filter != PIPE_TEX_MIPFILTER_NONE)) {
                bld4.num_mips = type4.length;
                bld4.num_lods = type4.length;
             }
-            else if (!is_fetch && min_img_filter != mag_img_filter) {
+            else if (op_is_tex && min_img_filter != mag_img_filter) {
                bld4.num_mips = 1;
                bld4.num_lods = type4.length;
             }
index 6a71da68acd76291966c40ece84da779db9ebc2c..ae527b2413058b7caa129fdf010ae331f4f98b1a 100644 (file)
@@ -1974,7 +1974,7 @@ emit_tex( struct lp_build_tgsi_soa_context *bld,
    unsigned num_derivs, num_offsets, i;
    unsigned shadow_coord = 0;
    unsigned layer_coord = 0;
-   unsigned sample_key = 0;
+   unsigned sample_key = LP_SAMPLER_OP_TEXTURE << LP_SAMPLER_OP_TYPE_SHIFT;
 
    memset(&params, 0, sizeof(params));
 
@@ -2179,7 +2179,7 @@ emit_sample(struct lp_build_tgsi_soa_context *bld,
 
    unsigned num_offsets, num_derivs, i;
    unsigned layer_coord = 0;
-   unsigned sample_key = 0;
+   unsigned sample_key = LP_SAMPLER_OP_TEXTURE << LP_SAMPLER_OP_TYPE_SHIFT;
 
    memset(&params, 0, sizeof(params));
 
@@ -2356,7 +2356,7 @@ emit_fetch_texels( struct lp_build_tgsi_soa_context *bld,
    enum lp_sampler_lod_property lod_property = LP_SAMPLER_LOD_SCALAR;
    unsigned dims, i;
    unsigned layer_coord = 0;
-   unsigned sample_key = LP_SAMPLER_FETCH;
+   unsigned sample_key = LP_SAMPLER_OP_FETCH << LP_SAMPLER_OP_TYPE_SHIFT;
 
    memset(&params, 0, sizeof(params));