llvmpipe: Support half integer pixel center fs coord.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 18 Apr 2013 10:39:19 +0000 (11:39 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Thu, 18 Apr 2013 13:18:25 +0000 (14:18 +0100)
Tested with graw/fs-fragcoord 2/3, and piglit
glsl-arb-fragment-coord-conventions.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/gallium/drivers/llvmpipe/lp_bld_interp.c
src/gallium/drivers/llvmpipe/lp_bld_interp.h
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/llvmpipe/lp_state_fs.c

index 083c6da3f874f48b21ce4ba5d53facecda625ec1..490a69179fa506e444fd6f133004cea1536892bf 100644 (file)
@@ -283,9 +283,15 @@ attribs_update_simple(struct lp_build_interp_soa_context *bld,
             case LP_INTERP_LINEAR:
                if (attrib == 0 && chan == 0) {
                   dadx = coeff_bld->one;
+                  if (bld->pos_offset) {
+                     a = lp_build_const_vec(gallivm, coeff_bld->type, bld->pos_offset);
+                  }
                }
                else if (attrib == 0 && chan == 1) {
                   dady = coeff_bld->one;
+                  if (bld->pos_offset) {
+                     a = lp_build_const_vec(gallivm, coeff_bld->type, bld->pos_offset);
+                  }
                }
                else {
                   dadx = lp_build_extract_broadcast(gallivm, setup_bld->type,
@@ -454,12 +460,20 @@ coeffs_init(struct lp_build_interp_soa_context *bld,
             LLVMValueRef chan_index = lp_build_const_int32(gallivm, chan);
 
             if (attrib == 0 && chan == 0) {
-               a = lp_build_broadcast_scalar(coeff_bld, bld->x);
+               a = bld->x;
+               if (bld->pos_offset) {
+                  a = LLVMBuildFAdd(builder, a, lp_build_const_float(gallivm, bld->pos_offset), "");
+               }
+               a = lp_build_broadcast_scalar(coeff_bld, a);
                dadx = coeff_bld->one;
                dady = coeff_bld->zero;
             }
             else if (attrib == 0 && chan == 1) {
-               a = lp_build_broadcast_scalar(coeff_bld, bld->y);
+               a = bld->y;
+               if (bld->pos_offset) {
+                  a = LLVMBuildFAdd(builder, a, lp_build_const_float(gallivm, bld->pos_offset), "");
+               }
+               a = lp_build_broadcast_scalar(coeff_bld, a);
                dady = coeff_bld->one;
                dadx = coeff_bld->zero;
             }
@@ -667,6 +681,7 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
                          struct gallivm_state *gallivm,
                          unsigned num_inputs,
                          const struct lp_shader_input *inputs,
+                         boolean pixel_center_integer,
                          LLVMBuilderRef builder,
                          struct lp_type type,
                          LLVMValueRef a0_ptr,
@@ -723,6 +738,12 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
       }
    }
 
+   if (pixel_center_integer) {
+      bld->pos_offset = 0.0;
+   } else {
+      bld->pos_offset = 0.5;
+   }
+
    pos_init(bld, x0, y0);
 
    if (coeff_type.length > 4) {
index 23c9a59ecdf3c111cd49516ef44e39c045fbfc0a..9029d2a41808e1713650224edfc0aea07a619a48 100644 (file)
@@ -86,6 +86,8 @@ struct lp_build_interp_soa_context
    enum lp_interp interp[1 + PIPE_MAX_SHADER_INPUTS];
    boolean simple_interp;
 
+   double pos_offset;
+
    LLVMValueRef x;
    LLVMValueRef y;
 
@@ -113,6 +115,7 @@ lp_build_interp_soa_init(struct lp_build_interp_soa_context *bld,
                          struct gallivm_state *gallivm,
                          unsigned num_inputs,
                          const struct lp_shader_input *inputs,
+                         boolean pixel_center_integer,
                          LLVMBuilderRef builder,
                          struct lp_type type,
                          LLVMValueRef a0_ptr,
index ebcf6803596ed1901e8a9b20a4276266f4d07734..7152c3e8bcad246f283df01f61f7eaaac50f96d1 100644 (file)
@@ -154,9 +154,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
    case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
+   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
       return 1;
    case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
-   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
       return 0;
    case PIPE_CAP_PRIMITIVE_RESTART:
       return 1;
index 3ec9e0c60254ba80555a3320e22b165cd24d428a..87128858c461e2a5089f1cd5af0f8f2b458db4e3 100644 (file)
@@ -1919,6 +1919,7 @@ generate_fragment(struct llvmpipe_context *lp,
                                gallivm,
                                shader->info.base.num_inputs,
                                inputs,
+                               shader->info.base.pixel_center_integer,
                                builder, fs_type,
                                a0_ptr, dadx_ptr, dady_ptr,
                                x, y);