r600g: disable handling of DISCARD_RANGE
[mesa.git] / src / gallium / drivers / r600 / evergreen_state.c
index 56b578b89f23a07d9f80a32e6a04f6e6554bb49b..89f27b44497c3af173dac3bc965c8fcf23680277 100644 (file)
@@ -620,6 +620,7 @@ boolean evergreen_is_format_supported(struct pipe_screen *screen,
                                      unsigned sample_count,
                                      unsigned usage)
 {
+       struct r600_screen *rscreen = (struct r600_screen*)screen;
        unsigned retval = 0;
 
        if (target >= PIPE_MAX_TEXTURE_TYPES) {
@@ -630,9 +631,29 @@ boolean evergreen_is_format_supported(struct pipe_screen *screen,
        if (!util_format_is_supported(format, usage))
                return FALSE;
 
-       /* Multisample */
-       if (sample_count > 1)
-               return FALSE;
+       if (sample_count > 1) {
+               if (rscreen->info.drm_minor < 19)
+                       return FALSE;
+
+               if (rscreen->chip_class != EVERGREEN)
+                       return FALSE;
+
+               switch (sample_count) {
+               case 2:
+               case 4:
+               case 8:
+                       break;
+               default:
+                       return FALSE;
+               }
+
+               /* require render-target support for multisample resources */
+               if (util_format_is_depth_or_stencil(format)) {
+                       usage |= PIPE_BIND_DEPTH_STENCIL;
+               } else {
+                       usage |= PIPE_BIND_RENDER_TARGET;
+               }
+       }
 
        if ((usage & PIPE_BIND_SAMPLER_VIEW) &&
            r600_is_sampler_format_supported(screen, format)) {
@@ -669,8 +690,8 @@ boolean evergreen_is_format_supported(struct pipe_screen *screen,
        return retval == usage;
 }
 
-static void *evergreen_create_blend_state(struct pipe_context *ctx,
-                                       const struct pipe_blend_state *state)
+static void *evergreen_create_blend_state_mode(struct pipe_context *ctx,
+                                              const struct pipe_blend_state *state, int mode)
 {
        struct r600_context *rctx = (struct r600_context *)ctx;
        struct r600_pipe_blend *blend = CALLOC_STRUCT(r600_pipe_blend);
@@ -706,7 +727,7 @@ static void *evergreen_create_blend_state(struct pipe_context *ctx,
        blend->cb_target_mask = target_mask;
 
        if (target_mask)
-               color_control |= S_028808_MODE(V_028808_CB_NORMAL);
+               color_control |= S_028808_MODE(mode);
        else
                color_control |= S_028808_MODE(V_028808_CB_DISABLE);
 
@@ -756,6 +777,13 @@ static void *evergreen_create_blend_state(struct pipe_context *ctx,
        return rstate;
 }
 
+static void *evergreen_create_blend_state(struct pipe_context *ctx,
+                                       const struct pipe_blend_state *state)
+{
+
+       return evergreen_create_blend_state_mode(ctx, state, V_028808_CB_NORMAL);
+}
+
 static void *evergreen_create_dsa_state(struct pipe_context *ctx,
                                   const struct pipe_depth_stencil_alpha_state *state)
 {
@@ -2989,6 +3017,17 @@ void evergreen_fetch_shader(struct pipe_context *ctx,
                                ve->fetch_shader, RADEON_USAGE_READ);
 }
 
+void *evergreen_create_resolve_blend(struct r600_context *rctx)
+{
+       struct pipe_blend_state blend;
+       struct r600_pipe_state *rstate;
+
+       memset(&blend, 0, sizeof(blend));
+       blend.rt[0].colormask = 0xf;
+       rstate = evergreen_create_blend_state_mode(&rctx->context, &blend, V_028808_CB_RESOLVE);
+       return rstate;
+}
+
 void *evergreen_create_db_flush_dsa(struct r600_context *rctx)
 {
        struct pipe_depth_stencil_alpha_state dsa = {{0}};