gallium: Use enum pipe_shader_type in set_shader_images()
[mesa.git] / src / gallium / drivers / radeonsi / si_pipe.c
index ffeeda3f2a355ef25a6c5594d30c9e2633aae226..8e7d021b3ae38d70134ed1a553ea5a4318c7754f 100644 (file)
@@ -186,7 +186,9 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
        sctx->b.gfx.cs = ws->cs_create(sctx->b.ctx, RING_GFX,
                                       si_context_gfx_flush, sctx);
 
-       if (!(sscreen->b.debug_flags & DBG_NO_CE) && ws->cs_add_const_ib) {
+       /* SI + AMDGPU + CE = GPU hang */
+       if (!(sscreen->b.debug_flags & DBG_NO_CE) && ws->cs_add_const_ib &&
+           sscreen->b.chip_class != SI) {
                sctx->ce_ib = ws->cs_add_const_ib(sctx->b.gfx.cs);
                if (!sctx->ce_ib)
                        goto fail;
@@ -251,8 +253,8 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
        si_begin_new_cs(sctx);
        r600_query_init_backend_mask(&sctx->b); /* this emits commands and must be last */
 
-       /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD is buggy
-        * with a NULL buffer). We need to use a dummy buffer instead. */
+       /* CIK cannot unbind a constant buffer (S_BUFFER_LOAD doesn't skip loads
+        * if NUM_RECORDS == 0). We need to use a dummy buffer instead. */
        if (sctx->b.chip_class == CIK) {
                sctx->null_const_buf.buffer = pipe_buffer_create(screen, PIPE_BIND_CONSTANT_BUFFER,
                                                                 PIPE_USAGE_DEFAULT, 16);
@@ -267,6 +269,15 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
                        }
                }
 
+               si_set_rw_buffer(sctx, SI_HS_CONST_DEFAULT_TESS_LEVELS,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_VS_CONST_CLIP_PLANES,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_PS_CONST_POLY_STIPPLE,
+                                &sctx->null_const_buf);
+               si_set_rw_buffer(sctx, SI_PS_CONST_SAMPLE_POSITIONS,
+                                &sctx->null_const_buf);
+
                /* Clear the NULL constant buffer, because loads should return zeros. */
                sctx->b.clear_buffer(&sctx->b.b, sctx->null_const_buf.buffer, 0,
                                     sctx->null_const_buf.buffer->width0, 0,
@@ -345,6 +356,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_START_INSTANCE:
        case PIPE_CAP_NPOT_TEXTURES:
        case PIPE_CAP_MIXED_FRAMEBUFFER_SIZES:
+       case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
        case PIPE_CAP_VERTEX_COLOR_CLAMPED:
        case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
         case PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER:
@@ -386,6 +398,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_GENERATE_MIPMAP:
        case PIPE_CAP_POLYGON_OFFSET_UNITS_UNSCALED:
        case PIPE_CAP_STRING_MARKER:
+       case PIPE_CAP_CLEAR_TEXTURE:
                return 1;
 
        case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
@@ -434,10 +447,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_FAKE_SW_MSAA:
        case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
        case PIPE_CAP_VERTEXID_NOBASE:
-       case PIPE_CAP_CLEAR_TEXTURE:
-       case PIPE_CAP_DRAW_PARAMETERS:
-       case PIPE_CAP_MULTI_DRAW_INDIRECT:
-       case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
        case PIPE_CAP_QUERY_BUFFER_OBJECT:
        case PIPE_CAP_CULL_DISTANCE:
        case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES:
@@ -445,6 +454,11 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_MAX_WINDOW_RECTANGLES:
                return 0;
 
+       case PIPE_CAP_DRAW_PARAMETERS:
+       case PIPE_CAP_MULTI_DRAW_INDIRECT:
+       case PIPE_CAP_MULTI_DRAW_INDIRECT_PARAMS:
+               return sscreen->has_draw_indirect_multi;
+
        case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
                return 30;