gallium: Add PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT
[mesa.git] / src / gallium / drivers / radeonsi / si_pipe.c
index fa607329177cd4b40303ab83da53418a455d5d86..275b6767be474787481b65d4da039664a265f606 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include "si_pipe.h"
+#include "si_shader.h"
 #include "si_public.h"
 #include "sid.h"
 
@@ -67,6 +68,8 @@ static void si_destroy_context(struct pipe_context *context)
                sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_decompress);
        if (sctx->custom_blend_fastclear)
                sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_fastclear);
+       if (sctx->custom_blend_dcc_decompress)
+               sctx->b.b.delete_blend_state(&sctx->b.b, sctx->custom_blend_dcc_decompress);
        util_unreference_framebuffer_state(&sctx->framebuffer.state);
 
        if (sctx->blitter)
@@ -137,9 +140,8 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen,
                sctx->b.b.create_video_buffer = vl_video_buffer_create;
        }
 
-       sctx->b.gfx.cs = ws->cs_create(sctx->b.ctx, RING_GFX, si_context_gfx_flush,
-                                      sctx, sscreen->b.trace_bo ?
-                                              sscreen->b.trace_bo->buf : NULL);
+       sctx->b.gfx.cs = ws->cs_create(sctx->b.ctx, RING_GFX,
+                                      si_context_gfx_flush, sctx);
        sctx->b.gfx.flush = si_context_gfx_flush;
 
        /* Border colors. */
@@ -354,6 +356,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_GENERATE_MIPMAP:
        case PIPE_CAP_STRING_MARKER:
        case PIPE_CAP_QUERY_BUFFER_OBJECT:
+       case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT:
                return 0;
 
        case PIPE_CAP_MAX_SHADER_PATCH_VARYINGS:
@@ -417,7 +420,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                return PIPE_ENDIAN_LITTLE;
 
        case PIPE_CAP_VENDOR_ID:
-               return 0x1002;
+               return ATI_VENDOR_ID;
        case PIPE_CAP_DEVICE_ID:
                return sscreen->b.info.pci_id;
        case PIPE_CAP_ACCELERATED:
@@ -426,6 +429,14 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                return sscreen->b.info.vram_size >> 20;
        case PIPE_CAP_UMA:
                return 0;
+       case PIPE_CAP_PCI_GROUP:
+               return sscreen->b.info.pci_domain;
+       case PIPE_CAP_PCI_BUS:
+               return sscreen->b.info.pci_bus;
+       case PIPE_CAP_PCI_DEVICE:
+               return sscreen->b.info.pci_dev;
+       case PIPE_CAP_PCI_FUNCTION:
+               return sscreen->b.info.pci_func;
        }
        return 0;
 }
@@ -457,7 +468,7 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
 
                case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE: {
                        uint64_t max_const_buffer_size;
-                       pscreen->get_compute_param(pscreen,
+                       pscreen->get_compute_param(pscreen, PIPE_SHADER_IR_TGSI,
                                PIPE_COMPUTE_CAP_MAX_MEM_ALLOC_SIZE,
                                &max_const_buffer_size);
                        return max_const_buffer_size;
@@ -529,6 +540,8 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
                return 32;
        case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
                return 0;
+       case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
+               return HAVE_LLVM >= 0x0309 ? SI_NUM_IMAGES : 0;
        }
        return 0;
 }
@@ -536,6 +549,14 @@ static int si_get_shader_param(struct pipe_screen* pscreen, unsigned shader, enu
 static void si_destroy_screen(struct pipe_screen* pscreen)
 {
        struct si_screen *sscreen = (struct si_screen *)pscreen;
+       struct si_shader_part *parts[] = {
+               sscreen->vs_prologs,
+               sscreen->vs_epilogs,
+               sscreen->tcs_epilogs,
+               sscreen->ps_prologs,
+               sscreen->ps_epilogs
+       };
+       unsigned i;
 
        if (!sscreen)
                return;
@@ -543,6 +564,18 @@ static void si_destroy_screen(struct pipe_screen* pscreen)
        if (!sscreen->b.ws->unref(sscreen->b.ws))
                return;
 
+       /* Free shader parts. */
+       for (i = 0; i < ARRAY_SIZE(parts); i++) {
+               while (parts[i]) {
+                       struct si_shader_part *part = parts[i];
+
+                       parts[i] = part->next;
+                       radeon_shader_binary_clean(&part->binary);
+                       FREE(part);
+               }
+       }
+       pipe_mutex_destroy(sscreen->shader_parts_mutex);
+       si_destroy_shader_cache(sscreen);
        r600_destroy_common_screen(&sscreen->b);
 }
 
@@ -566,6 +599,8 @@ static bool si_init_gs_info(struct si_screen *sscreen)
        case CHIP_HAWAII:
        case CHIP_TONGA:
        case CHIP_FIJI:
+       case CHIP_POLARIS10:
+       case CHIP_POLARIS11:
                sscreen->gs_table_depth = 32;
                return true;
        default:
@@ -589,8 +624,11 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
        sscreen->b.b.is_format_supported = si_is_format_supported;
        sscreen->b.b.resource_create = r600_resource_create_common;
 
+       si_init_screen_state_functions(sscreen);
+
        if (!r600_common_screen_init(&sscreen->b, ws) ||
-           !si_init_gs_info(sscreen)) {
+           !si_init_gs_info(sscreen) ||
+           !si_init_shader_cache(sscreen)) {
                FREE(sscreen);
                return NULL;
        }
@@ -600,6 +638,10 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
 
        sscreen->b.has_cp_dma = true;
        sscreen->b.has_streamout = true;
+       pipe_mutex_init(sscreen->shader_parts_mutex);
+       sscreen->use_monolithic_shaders =
+               HAVE_LLVM < 0x0308 ||
+               (sscreen->b.debug_flags & DBG_MONOLITHIC_SHADERS) != 0;
 
        if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
                sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | DBG_CS;