r600g: set minimum point size to 1.0 for non-sprite non-aa points
authorMarek Olšák <maraeo@gmail.com>
Fri, 27 Jan 2012 20:20:27 +0000 (21:20 +0100)
committerMarek Olšák <maraeo@gmail.com>
Mon, 30 Jan 2012 23:54:34 +0000 (00:54 +0100)
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/evergreend.h
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_state.c

index a988fabe3c1bde233a1bdd51cef5607d6bc0c3c0..86d168cc11394e0d56b544bfd82baf9a87366bc5 100644 (file)
@@ -889,6 +889,7 @@ static void *evergreen_create_rs_state(struct pipe_context *ctx,
        unsigned tmp;
        unsigned prov_vtx = 1, polygon_dual_mode;
        unsigned clip_rule;
+       float psize_min, psize_max;
 
        if (rs == NULL) {
                return NULL;
@@ -942,7 +943,14 @@ static void *evergreen_create_rs_state(struct pipe_context *ctx,
        /* point size 12.4 fixed point */
        tmp = (unsigned)(state->point_size * 8.0);
        r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);
-       r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 0x80000000, 0xFFFFFFFF, NULL, 0);
+
+       psize_min = util_get_min_point_size(state);
+       psize_max = 8192;
+       /* Divide by two, because 0.5 = 1 pixel. */
+       r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX,
+                               S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
+                               S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)),
+                               0xFFFFFFFF, NULL, 0);
 
        tmp = (unsigned)state->line_width * 8;
        r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);
index d0c113013dd9c9195696abb8c2299b676348ad37..3345ebf93108ea799d76e737d6e8559f5495a91b 100644 (file)
 #define R_028980_ALU_CONST_CACHE_VS_0                0x00028980
 #define R_028984_ALU_CONST_CACHE_VS_1                0x00028984
 #define R_028A04_PA_SU_POINT_MINMAX                  0x00028A04
+#define   S_028A04_MIN_SIZE(x)                         (((x) & 0xFFFF) << 0)
+#define   G_028A04_MIN_SIZE(x)                         (((x) >> 0) & 0xFFFF)
+#define   C_028A04_MIN_SIZE                            0xFFFF0000
+#define   S_028A04_MAX_SIZE(x)                         (((x) & 0xFFFF) << 16)
+#define   G_028A04_MAX_SIZE(x)                         (((x) >> 16) & 0xFFFF)
+#define   C_028A04_MAX_SIZE                            0x0000FFFF
 #define R_028A08_PA_SU_LINE_CNTL                     0x00028A08
 #define   S_028A08_WIDTH(x)                            (((x) & 0xFFFF) << 0)
 #define   G_028A08_WIDTH(x)                            (((x) >> 0) & 0xFFFF)
index 47c6ad0335a2097df163b0f585f475426d237f54..7d0d697243dada100987a37518c1f80004b77c57 100644 (file)
@@ -385,4 +385,11 @@ static inline unsigned r600_tex_aniso_filter(unsigned filter)
         /* else */        return 4;
 }
 
+/* 12.4 fixed-point */
+static INLINE unsigned r600_pack_float_12p4(float x)
+{
+       return x <= 0    ? 0 :
+              x >= 4096 ? 0xffff : x * 16;
+}
+
 #endif
index 2dcc245ad4dd27e5177a14d8753e49ba119dac11..26eb92a08f0e78adac626a5fc1f006b6150b850d 100644 (file)
@@ -948,6 +948,7 @@ static void *r600_create_rs_state(struct pipe_context *ctx,
        unsigned prov_vtx = 1, polygon_dual_mode;
        unsigned clip_rule;
        unsigned sc_mode_cntl;
+       float psize_min, psize_max;
 
        if (rs == NULL) {
                return NULL;
@@ -1000,7 +1001,14 @@ static void *r600_create_rs_state(struct pipe_context *ctx,
        /* point size 12.4 fixed point */
        tmp = (unsigned)(state->point_size * 8.0);
        r600_pipe_state_add_reg(rstate, R_028A00_PA_SU_POINT_SIZE, S_028A00_HEIGHT(tmp) | S_028A00_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);
-       r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX, 0x80000000, 0xFFFFFFFF, NULL, 0);
+
+       psize_min = util_get_min_point_size(state);
+       psize_max = 8192;
+       /* Divide by two, because 0.5 = 1 pixel. */
+       r600_pipe_state_add_reg(rstate, R_028A04_PA_SU_POINT_MINMAX,
+                               S_028A04_MIN_SIZE(r600_pack_float_12p4(psize_min/2)) |
+                               S_028A04_MAX_SIZE(r600_pack_float_12p4(psize_max/2)),
+                               0xFFFFFFFF, NULL, 0);
 
        tmp = (unsigned)state->line_width * 8;
        r600_pipe_state_add_reg(rstate, R_028A08_PA_SU_LINE_CNTL, S_028A08_WIDTH(tmp), 0xFFFFFFFF, NULL, 0);