radeonsi: avoid stale state pointers
[mesa.git] / src / gallium / drivers / radeonsi / si_pipe.c
index 0057f50dcc76c9dc049572d2721d02581a45fac2..ac9e49a9cb8b1a9ba3f6947ec70264aa0a50cfa6 100644 (file)
@@ -83,15 +83,9 @@ static void si_destroy_context(struct pipe_context *context)
        pipe_resource_reference(&sctx->null_const_buf.buffer, NULL);
        r600_resource_reference(&sctx->border_color_table, NULL);
 
-       if (sctx->gs_on) {
-               si_pm4_free_state(sctx, sctx->gs_on, 0);
-       }
-       if (sctx->gs_off) {
-               si_pm4_free_state(sctx, sctx->gs_off, 0);
-       }
-       if (sctx->gs_rings) {
-               si_pm4_free_state(sctx, sctx->gs_rings, 0);
-       }
+       si_pm4_delete_state(sctx, gs_rings, sctx->gs_rings);
+       si_pm4_delete_state(sctx, gs_onoff, sctx->gs_on);
+       si_pm4_delete_state(sctx, gs_onoff, sctx->gs_off);
 
        if (sctx->dummy_pixel_shader) {
                sctx->b.b.delete_fs_state(&sctx->b.b, sctx->dummy_pixel_shader);
@@ -183,7 +177,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void *
         * with a NULL buffer). 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_STATIC, 16);
+                                                                PIPE_USAGE_DEFAULT, 16);
                sctx->null_const_buf.buffer_size = sctx->null_const_buf.buffer->width0;
 
                for (shader = 0; shader < SI_NUM_SHADERS; shader++) {
@@ -252,6 +246,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_TEXTURE_BUFFER_OBJECTS:
         case PIPE_CAP_TGSI_VS_LAYER:
        case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
+       case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
                return 1;
 
        case PIPE_CAP_TEXTURE_MULTISAMPLE:
@@ -269,7 +264,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                return 256;
 
        case PIPE_CAP_GLSL_FEATURE_LEVEL:
-               return 140;
+               return HAVE_LLVM >= 0x0305 ? 330 : 140;
 
        case PIPE_CAP_TEXTURE_BUFFER_OFFSET_ALIGNMENT:
                return 1;
@@ -285,6 +280,8 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
        case PIPE_CAP_USER_VERTEX_BUFFERS:
        case PIPE_CAP_CUBE_MAP_ARRAY:
+       case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+       case PIPE_CAP_TEXTURE_GATHER_SM5:
                return 0;
 
        case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
@@ -299,6 +296,12 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_MAX_STREAM_OUTPUT_INTERLEAVED_COMPONENTS:
                return sscreen->b.has_streamout ? 32*4 : 0;
 
+       /* Geometry shader output. */
+       case PIPE_CAP_MAX_GEOMETRY_OUTPUT_VERTICES:
+               return 1024;
+       case PIPE_CAP_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS:
+               return 4095;
+
        /* Texturing. */
        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
        case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
@@ -306,8 +309,6 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                        return 15;
        case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
                return 16384;
-       case PIPE_CAP_MAX_COMBINED_SAMPLERS:
-               return 32;
 
        /* Render targets. */
        case PIPE_CAP_MAX_RENDER_TARGETS:
@@ -340,8 +341,10 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
        case PIPE_SHADER_VERTEX:
                break;
        case PIPE_SHADER_GEOMETRY:
-               /* TODO: support and enable geometry programs */
+#if HAVE_LLVM < 0x0305
                return 0;
+#endif
+               break;
        case PIPE_SHADER_COMPUTE:
                switch (param) {
                case PIPE_SHADER_CAP_PREFERRED_IR:
@@ -380,6 +383,10 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
        case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
                return 0;
        case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
+               /* Indirection of geometry shader input dimension is not
+                * handled yet
+                */
+               return shader < PIPE_SHADER_GEOMETRY;
        case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR:
        case PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR:
        case PIPE_SHADER_CAP_INDIRECT_CONST_ADDR: