Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright 2010 Jerome Glisse <glisse@freedesktop.org>
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * on the rights to use, copy, modify, merge, publish, distribute, sub
  8.  * license, and/or sell copies of the Software, and to permit persons to whom
  9.  * the Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18.  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
  19.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  20.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  21.  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  22.  *
  23.  * Authors:
  24.  *      Jerome Glisse
  25.  */
  26. #ifndef SI_PIPE_H
  27. #define SI_PIPE_H
  28.  
  29. #include "si_state.h"
  30.  
  31. #include <llvm-c/TargetMachine.h>
  32.  
  33. #ifdef PIPE_ARCH_BIG_ENDIAN
  34. #define SI_BIG_ENDIAN 1
  35. #else
  36. #define SI_BIG_ENDIAN 0
  37. #endif
  38.  
  39. /* The base vertex and primitive restart can be any number, but we must pick
  40.  * one which will mean "unknown" for the purpose of state tracking and
  41.  * the number shouldn't be a commonly-used one. */
  42. #define SI_BASE_VERTEX_UNKNOWN INT_MIN
  43. #define SI_RESTART_INDEX_UNKNOWN INT_MIN
  44. #define SI_NUM_SMOOTH_AA_SAMPLES 8
  45.  
  46. #define SI_TRACE_CS 0
  47. #define SI_TRACE_CS_DWORDS              6
  48.  
  49. #define SI_MAX_DRAW_CS_DWORDS \
  50.         (/*scratch:*/ 3 + /*derived prim state:*/ 3 + \
  51.          /*draw regs:*/ 16 + /*draw packets:*/ 31)
  52.  
  53. /* Instruction cache. */
  54. #define SI_CONTEXT_INV_ICACHE           (R600_CONTEXT_PRIVATE_FLAG << 0)
  55. /* Cache used by scalar memory (SMEM) instructions. They also use TC
  56.  * as a second level cache, which isn't flushed by this.
  57.  * Other names: constant cache, data cache, DCACHE */
  58. #define SI_CONTEXT_INV_KCACHE           (R600_CONTEXT_PRIVATE_FLAG << 1)
  59. /* Caches used by vector memory (VMEM) instructions.
  60.  * L1 can optionally be bypassed (GLC=1) and can only be used by shaders.
  61.  * L2 is used by shaders and can be used by other blocks (CP, sDMA). */
  62. #define SI_CONTEXT_INV_TC_L1            (R600_CONTEXT_PRIVATE_FLAG << 2)
  63. #define SI_CONTEXT_INV_TC_L2            (R600_CONTEXT_PRIVATE_FLAG << 3)
  64. /* Framebuffer caches. */
  65. #define SI_CONTEXT_FLUSH_AND_INV_CB_META (R600_CONTEXT_PRIVATE_FLAG << 4)
  66. #define SI_CONTEXT_FLUSH_AND_INV_DB_META (R600_CONTEXT_PRIVATE_FLAG << 5)
  67. #define SI_CONTEXT_FLUSH_AND_INV_DB     (R600_CONTEXT_PRIVATE_FLAG << 6)
  68. #define SI_CONTEXT_FLUSH_AND_INV_CB     (R600_CONTEXT_PRIVATE_FLAG << 7)
  69. /* Engine synchronization. */
  70. #define SI_CONTEXT_VS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 8)
  71. #define SI_CONTEXT_PS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 9)
  72. #define SI_CONTEXT_CS_PARTIAL_FLUSH     (R600_CONTEXT_PRIVATE_FLAG << 10)
  73. #define SI_CONTEXT_VGT_FLUSH            (R600_CONTEXT_PRIVATE_FLAG << 11)
  74. #define SI_CONTEXT_VGT_STREAMOUT_SYNC   (R600_CONTEXT_PRIVATE_FLAG << 12)
  75. /* Compute only. */
  76. #define SI_CONTEXT_FLUSH_WITH_INV_L2    (R600_CONTEXT_PRIVATE_FLAG << 13) /* TODO: merge with TC? */
  77. #define SI_CONTEXT_FLAG_COMPUTE         (R600_CONTEXT_PRIVATE_FLAG << 14)
  78.  
  79. #define SI_CONTEXT_FLUSH_AND_INV_FRAMEBUFFER (SI_CONTEXT_FLUSH_AND_INV_CB | \
  80.                                               SI_CONTEXT_FLUSH_AND_INV_CB_META | \
  81.                                               SI_CONTEXT_FLUSH_AND_INV_DB | \
  82.                                               SI_CONTEXT_FLUSH_AND_INV_DB_META)
  83.  
  84. struct si_compute;
  85.  
  86. struct si_screen {
  87.         struct r600_common_screen       b;
  88. };
  89.  
  90. struct si_sampler_view {
  91.         struct pipe_sampler_view        base;
  92.         struct list_head                list;
  93.         struct r600_resource            *resource;
  94.         /* [0..7] = image descriptor
  95.          * [4..7] = buffer descriptor */
  96.         uint32_t                        state[8];
  97.         uint32_t                        fmask_state[8];
  98. };
  99.  
  100. struct si_sampler_state {
  101.         uint32_t                        val[4];
  102.         uint32_t                        border_color[4];
  103. };
  104.  
  105. struct si_cs_shader_state {
  106.         struct si_compute               *program;
  107. };
  108.  
  109. struct si_textures_info {
  110.         struct si_sampler_views         views;
  111.         struct si_sampler_states        states;
  112.         uint32_t                        depth_texture_mask; /* which textures are depth */
  113.         uint32_t                        compressed_colortex_mask;
  114. };
  115.  
  116. struct si_framebuffer {
  117.         struct r600_atom                atom;
  118.         struct pipe_framebuffer_state   state;
  119.         unsigned                        nr_samples;
  120.         unsigned                        log_samples;
  121.         unsigned                        cb0_is_integer;
  122.         unsigned                        compressed_cb_mask;
  123.         unsigned                        export_16bpc;
  124. };
  125.  
  126. #define SI_NUM_ATOMS(sctx) (sizeof((sctx)->atoms)/sizeof((sctx)->atoms.array[0]))
  127.  
  128. #define SI_NUM_SHADERS (PIPE_SHADER_GEOMETRY+1)
  129.  
  130. struct si_context {
  131.         struct r600_common_context      b;
  132.         struct blitter_context          *blitter;
  133.         void                            *custom_dsa_flush;
  134.         void                            *custom_blend_resolve;
  135.         void                            *custom_blend_decompress;
  136.         void                            *custom_blend_fastclear;
  137.         void                            *pstipple_sampler_state;
  138.         struct si_screen                *screen;
  139.         struct si_pm4_state             *init_config;
  140.  
  141.         union {
  142.                 struct {
  143.                         /* The order matters. */
  144.                         struct r600_atom *vertex_buffers;
  145.                         struct r600_atom *const_buffers[SI_NUM_SHADERS];
  146.                         struct r600_atom *rw_buffers[SI_NUM_SHADERS];
  147.                         struct r600_atom *sampler_views[SI_NUM_SHADERS];
  148.                         struct r600_atom *sampler_states[SI_NUM_SHADERS];
  149.                         /* Caches must be flushed after resource descriptors are
  150.                          * updated in memory. */
  151.                         struct r600_atom *cache_flush;
  152.                         struct r600_atom *streamout_begin;
  153.                         struct r600_atom *streamout_enable; /* must be after streamout_begin */
  154.                         struct r600_atom *framebuffer;
  155.                         struct r600_atom *msaa_sample_locs;
  156.                         struct r600_atom *db_render_state;
  157.                         struct r600_atom *msaa_config;
  158.                         struct r600_atom *clip_regs;
  159.                 } s;
  160.                 struct r600_atom *array[0];
  161.         } atoms;
  162.  
  163.         struct si_framebuffer           framebuffer;
  164.         struct si_vertex_element        *vertex_elements;
  165.         /* for saving when using blitter */
  166.         struct pipe_stencil_ref         stencil_ref;
  167.         /* shaders */
  168.         struct si_shader_selector       *ps_shader;
  169.         struct si_shader_selector       *gs_shader;
  170.         struct si_shader_selector       *vs_shader;
  171.         struct si_cs_shader_state       cs_shader_state;
  172.         /* shader information */
  173.         unsigned                        sprite_coord_enable;
  174.         bool                            flatshade;
  175.         struct si_descriptors           vertex_buffers;
  176.         struct si_buffer_resources      const_buffers[SI_NUM_SHADERS];
  177.         struct si_buffer_resources      rw_buffers[SI_NUM_SHADERS];
  178.         struct si_textures_info         samplers[SI_NUM_SHADERS];
  179.         struct r600_resource            *scratch_buffer;
  180.         struct r600_resource            *border_color_table;
  181.         unsigned                        border_color_offset;
  182.  
  183.         struct r600_atom                clip_regs;
  184.         struct r600_atom                msaa_sample_locs;
  185.         struct r600_atom                msaa_config;
  186.         int                             ps_iter_samples;
  187.         bool                            smoothing_enabled;
  188.  
  189.         /* Vertex and index buffers. */
  190.         bool                    vertex_buffers_dirty;
  191.         struct pipe_index_buffer index_buffer;
  192.         struct pipe_vertex_buffer vertex_buffer[SI_NUM_VERTEX_BUFFERS];
  193.  
  194.         /* With rasterizer discard, there doesn't have to be a pixel shader.
  195.          * In that case, we bind this one: */
  196.         void                    *dummy_pixel_shader;
  197.         struct si_pm4_state     *gs_on;
  198.         struct si_pm4_state     *gs_off;
  199.         struct si_pm4_state     *gs_rings;
  200.         struct r600_atom        cache_flush;
  201.         struct pipe_constant_buffer null_const_buf; /* used for set_constant_buffer(NULL) on CIK */
  202.         struct pipe_resource    *esgs_ring;
  203.         struct pipe_resource    *gsvs_ring;
  204.  
  205.         LLVMTargetMachineRef            tm;
  206.  
  207.         /* SI state handling */
  208.         union si_state  queued;
  209.         union si_state  emitted;
  210.  
  211.         /* DB render state. */
  212.         struct r600_atom        db_render_state;
  213.         bool                    dbcb_depth_copy_enabled;
  214.         bool                    dbcb_stencil_copy_enabled;
  215.         unsigned                dbcb_copy_sample;
  216.         bool                    db_inplace_flush_enabled;
  217.         bool                    db_depth_clear;
  218.         bool                    db_depth_disable_expclear;
  219.         unsigned                ps_db_shader_control;
  220.  
  221.         /* Draw state. */
  222.         int                     last_base_vertex;
  223.         int                     last_start_instance;
  224.         int                     last_sh_base_reg;
  225.         int                     last_primitive_restart_en;
  226.         int                     last_restart_index;
  227.         int                     last_gs_out_prim;
  228.         int                     last_prim;
  229.         int                     last_multi_vgt_param;
  230.         int                     last_rast_prim;
  231.         unsigned                last_sc_line_stipple;
  232.         int                     current_rast_prim; /* primitive type after TES, GS */
  233.  
  234.         /* Scratch buffer */
  235.         boolean                 emit_scratch_reloc;
  236.         unsigned                scratch_waves;
  237.         unsigned                spi_tmpring_size;
  238. };
  239.  
  240. /* si_blit.c */
  241. void si_init_blit_functions(struct si_context *sctx);
  242. void si_flush_depth_textures(struct si_context *sctx,
  243.                              struct si_textures_info *textures);
  244. void si_decompress_color_textures(struct si_context *sctx,
  245.                                   struct si_textures_info *textures);
  246. void si_resource_copy_region(struct pipe_context *ctx,
  247.                              struct pipe_resource *dst,
  248.                              unsigned dst_level,
  249.                              unsigned dstx, unsigned dsty, unsigned dstz,
  250.                              struct pipe_resource *src,
  251.                              unsigned src_level,
  252.                              const struct pipe_box *src_box);
  253.  
  254. /* si_dma.c */
  255. void si_dma_copy(struct pipe_context *ctx,
  256.                  struct pipe_resource *dst,
  257.                  unsigned dst_level,
  258.                  unsigned dstx, unsigned dsty, unsigned dstz,
  259.                  struct pipe_resource *src,
  260.                  unsigned src_level,
  261.                  const struct pipe_box *src_box);
  262.  
  263. /* si_hw_context.c */
  264. void si_context_gfx_flush(void *context, unsigned flags,
  265.                           struct pipe_fence_handle **fence);
  266. void si_begin_new_cs(struct si_context *ctx);
  267. void si_need_cs_space(struct si_context *ctx, unsigned num_dw, boolean count_draw_in);
  268.  
  269. #if SI_TRACE_CS
  270. void si_trace_emit(struct si_context *sctx);
  271. #endif
  272.  
  273. /* si_compute.c */
  274. void si_init_compute_functions(struct si_context *sctx);
  275.  
  276. /* si_uvd.c */
  277. struct pipe_video_codec *si_uvd_create_decoder(struct pipe_context *context,
  278.                                                const struct pipe_video_codec *templ);
  279.  
  280. struct pipe_video_buffer *si_video_buffer_create(struct pipe_context *pipe,
  281.                                                  const struct pipe_video_buffer *tmpl);
  282.  
  283. /*
  284.  * common helpers
  285.  */
  286.  
  287. static INLINE struct r600_resource *
  288. si_resource_create_custom(struct pipe_screen *screen,
  289.                           unsigned usage, unsigned size)
  290. {
  291.         assert(size);
  292.         return r600_resource(pipe_buffer_create(screen,
  293.                 PIPE_BIND_CUSTOM, usage, size));
  294. }
  295.  
  296. static INLINE void
  297. si_invalidate_draw_sh_constants(struct si_context *sctx)
  298. {
  299.         sctx->last_base_vertex = SI_BASE_VERTEX_UNKNOWN;
  300.         sctx->last_start_instance = -1; /* reset to an unknown value */
  301.         sctx->last_sh_base_reg = -1; /* reset to an unknown value */
  302. }
  303.  
  304. #endif
  305.