gallium: split depth_clip into depth_clip_near & depth_clip_far
[mesa.git] / src / gallium / drivers / radeonsi / si_state.c
index fc5d63f02d3c018cb51a8d58327f6fb9856fbd5e..18024a9f77dc14f2578d9415e385b0f24dca4476 100644 (file)
@@ -869,8 +869,8 @@ static void *si_create_rs_state(struct pipe_context *ctx,
                                S_028A0C_REPEAT_COUNT(state->line_stipple_factor) : 0;
        rs->pa_cl_clip_cntl =
                S_028810_DX_CLIP_SPACE_DEF(state->clip_halfz) |
-               S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip) |
-               S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip) |
+               S_028810_ZCLIP_NEAR_DISABLE(!state->depth_clip_near) |
+               S_028810_ZCLIP_FAR_DISABLE(!state->depth_clip_near) |
                S_028810_DX_RASTERIZATION_KILL(state->rasterizer_discard) |
                S_028810_DX_LINEAR_ATTR_CLIP_ENA(1);
 
@@ -2143,6 +2143,9 @@ static boolean si_is_format_supported(struct pipe_screen *screen,
                return false;
        }
 
+       if (MAX2(1, sample_count) < MAX2(1, storage_sample_count))
+               return false;
+
        if (sample_count > 1) {
                if (!screen->get_param(screen, PIPE_CAP_TEXTURE_MULTISAMPLE))
                        return false;
@@ -2150,25 +2153,26 @@ static boolean si_is_format_supported(struct pipe_screen *screen,
                if (usage & PIPE_BIND_SHADER_IMAGE)
                        return false;
 
-               if (sample_count != storage_sample_count)
+               /* Only power-of-two sample counts are supported. */
+               if (!util_is_power_of_two_or_zero(sample_count) ||
+                   !util_is_power_of_two_or_zero(storage_sample_count))
                        return false;
 
-               switch (sample_count) {
-               case 2:
-               case 4:
-               case 8:
-                       break;
-               case 16:
-                       /* Allow resource_copy_region with nr_samples == 16. */
-                       if (sscreen->eqaa_force_coverage_samples == 16 &&
-                           !util_format_is_depth_or_stencil(format))
-                               return true;
-                       if (format == PIPE_FORMAT_NONE)
-                               return true;
-                       else
+               /* MSAA support without framebuffer attachments. */
+               if (format == PIPE_FORMAT_NONE && sample_count <= 16)
+                       return true;
+
+               if (!sscreen->info.has_eqaa_surface_allocator ||
+                   util_format_is_depth_or_stencil(format)) {
+                       /* Color without EQAA or depth/stencil. */
+                       if (sample_count > 8 ||
+                           sample_count != storage_sample_count)
+                               return false;
+               } else {
+                       /* Color with EQAA. */
+                       if (sample_count > 16 ||
+                           storage_sample_count > 8)
                                return false;
-               default:
-                       return false;
                }
        }
 
@@ -2431,7 +2435,7 @@ static void si_initialize_color_surface(struct si_context *sctx,
 
        if (tex->buffer.b.b.nr_samples > 1) {
                unsigned log_samples = util_logbase2(tex->buffer.b.b.nr_samples);
-               unsigned log_fragments = util_logbase2(tex->num_color_samples);
+               unsigned log_fragments = util_logbase2(tex->buffer.b.b.nr_storage_samples);
 
                color_attrib |= S_028C74_NUM_SAMPLES(log_samples) |
                                S_028C74_NUM_FRAGMENTS(log_fragments);
@@ -2458,7 +2462,7 @@ static void si_initialize_color_surface(struct si_context *sctx,
                if (!sctx->screen->info.has_dedicated_vram)
                        min_compressed_block_size = V_028C78_MIN_BLOCK_SIZE_64B;
 
-               if (tex->num_color_samples > 1) {
+               if (tex->buffer.b.b.nr_storage_samples > 1) {
                        if (tex->surface.bpe == 1)
                                max_uncompressed_block_size = V_028C78_MAX_BLOCK_SIZE_64B;
                        else if (tex->surface.bpe == 2)
@@ -2869,10 +2873,12 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
                 * (e.g. destination of MSAA resolve)
                 */
                if (tex->buffer.b.b.nr_samples >= 2 &&
-                   tex->num_color_samples < tex->buffer.b.b.nr_samples) {
+                   tex->buffer.b.b.nr_storage_samples < tex->buffer.b.b.nr_samples) {
                        sctx->framebuffer.nr_color_samples =
                                MIN2(sctx->framebuffer.nr_color_samples,
-                                    tex->num_color_samples);
+                                    tex->buffer.b.b.nr_storage_samples);
+                       sctx->framebuffer.nr_color_samples =
+                               MAX2(1, sctx->framebuffer.nr_color_samples);
                }
 
                if (tex->surface.is_linear)
@@ -3633,7 +3639,8 @@ si_make_texture_descriptor(struct si_screen *screen,
        desc = util_format_description(pipe_format);
 
        num_samples = desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS ?
-                       MAX2(1, res->nr_samples) : tex->num_color_samples;
+                       MAX2(1, res->nr_samples) :
+                       MAX2(1, res->nr_storage_samples);
 
        if (desc->colorspace == UTIL_FORMAT_COLORSPACE_ZS) {
                const unsigned char swizzle_xxxx[4] = {0, 0, 0, 0};
@@ -3831,10 +3838,10 @@ si_make_texture_descriptor(struct si_screen *screen,
 
                va = tex->buffer.gpu_address + tex->fmask_offset;
 
-#define FMASK(s,f) (((unsigned)(s) * 16) + (f))
+#define FMASK(s,f) (((unsigned)(MAX2(1, s)) * 16) + (MAX2(1, f)))
                if (screen->info.chip_class >= GFX9) {
                        data_format = V_008F14_IMG_DATA_FORMAT_FMASK;
-                       switch (FMASK(res->nr_samples, tex->num_color_samples)) {
+                       switch (FMASK(res->nr_samples, res->nr_storage_samples)) {
                        case FMASK(2,1):
                                num_format = V_008F14_IMG_FMASK_8_2_1;
                                break;
@@ -3878,7 +3885,7 @@ si_make_texture_descriptor(struct si_screen *screen,
                                unreachable("invalid nr_samples");
                        }
                } else {
-                       switch (FMASK(res->nr_samples, tex->num_color_samples)) {
+                       switch (FMASK(res->nr_samples, res->nr_storage_samples)) {
                        case FMASK(2,1):
                                data_format = V_008F14_IMG_DATA_FORMAT_FMASK8_S2_F1;
                                break;
@@ -4865,7 +4872,6 @@ static void si_init_config(struct si_context *sctx)
        }
 
        if (!has_clear_state) {
-               si_pm4_set_reg(pm4, R_02820C_PA_SC_CLIPRECT_RULE, 0xFFFF);
                si_pm4_set_reg(pm4, R_028230_PA_SC_EDGERULE,
                               S_028230_ER_TRI(0xA) |
                               S_028230_ER_POINT(0xA) |