radeonsi: inline util_blitter_copy_texture
[mesa.git] / src / gallium / drivers / radeonsi / si_pipe.c
index cf11fc7137cdc8ad8a0364cddb3a702a1a00984d..ff11a67b7b1734edb07f767d7f2c53318457e5e1 100644 (file)
  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-#include <stdio.h>
-#include <errno.h>
-#include "pipe/p_defines.h"
-#include "pipe/p_state.h"
-#include "pipe/p_context.h"
-#include "tgsi/tgsi_scan.h"
-#include "tgsi/tgsi_parse.h"
-#include "tgsi/tgsi_util.h"
+
+#include "si_pipe.h"
+#include "si_public.h"
+
+#include "radeon/radeon_uvd.h"
 #include "util/u_blitter.h"
-#include "util/u_double_list.h"
-#include "util/u_format.h"
-#include "util/u_transfer.h"
-#include "util/u_surface.h"
-#include "util/u_pack_color.h"
 #include "util/u_memory.h"
-#include "util/u_inlines.h"
 #include "util/u_simple_shaders.h"
-#include "util/u_upload_mgr.h"
 #include "vl/vl_decoder.h"
-#include "vl/vl_video_buffer.h"
-#include "os/os_time.h"
-#include "pipebuffer/pb_buffer.h"
-#include "si_pipe.h"
-#include "radeon/radeon_uvd.h"
-#include "sid.h"
-#include "si_resource.h"
-#include "si_pipe.h"
-#include "si_state.h"
-#include "../radeon/r600_cs.h"
 
 /*
  * pipe_context
@@ -103,6 +83,16 @@ 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);
+       }
+
        if (sctx->dummy_pixel_shader) {
                sctx->b.b.delete_fs_state(&sctx->b.b, sctx->dummy_pixel_shader);
        }
@@ -193,7 +183,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++) {
@@ -262,6 +252,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:
@@ -279,7 +270,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;
@@ -295,6 +286,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:
@@ -309,6 +302,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:
@@ -316,8 +315,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:
@@ -350,8 +347,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:
@@ -390,6 +389,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:
@@ -433,6 +436,7 @@ struct pipe_screen *radeonsi_screen_create(struct radeon_winsys *ws)
        sscreen->b.b.get_param = si_get_param;
        sscreen->b.b.get_shader_param = si_get_shader_param;
        sscreen->b.b.is_format_supported = si_is_format_supported;
+       sscreen->b.b.resource_create = r600_resource_create_common;
 
        if (!r600_common_screen_init(&sscreen->b, ws)) {
                FREE(sscreen);