swr_context.h revision 7ec681f3
1/****************************************************************************
2 * Copyright (C) 2015 Intel Corporation.   All Rights Reserved.
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 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 ***************************************************************************/
23
24#ifndef SWR_CONTEXT_H
25#define SWR_CONTEXT_H
26
27#include "common/os.h"
28
29#include "pipe/p_context.h"
30#include "pipe/p_state.h"
31#include "util/u_blitter.h"
32#include "rasterizer/memory/SurfaceState.h"
33#include "rasterizer/memory/InitMemory.h"
34#include "jit_api.h"
35#include "swr_state.h"
36#include <unordered_map>
37
38#define SWR_NEW_BLEND (1 << 0)
39#define SWR_NEW_RASTERIZER (1 << 1)
40#define SWR_NEW_DEPTH_STENCIL_ALPHA (1 << 2)
41#define SWR_NEW_SAMPLER (1 << 3)
42#define SWR_NEW_SAMPLER_VIEW (1 << 4)
43#define SWR_NEW_VS (1 << 5)
44#define SWR_NEW_FS (1 << 6)
45#define SWR_NEW_GS (1 << 7)
46#define SWR_NEW_VSCONSTANTS (1 << 8)
47#define SWR_NEW_FSCONSTANTS (1 << 9)
48#define SWR_NEW_GSCONSTANTS (1 << 10)
49#define SWR_NEW_VERTEX (1 << 11)
50#define SWR_NEW_STIPPLE (1 << 12)
51#define SWR_NEW_SCISSOR (1 << 13)
52#define SWR_NEW_VIEWPORT (1 << 14)
53#define SWR_NEW_FRAMEBUFFER (1 << 15)
54#define SWR_NEW_CLIP (1 << 16)
55#define SWR_NEW_SO (1 << 17)
56#define SWR_BLOCK_CLIENT_DRAW ( 1 << 18) // Indicates client draw will block
57#define SWR_NEW_TCS (1 << 19)
58#define SWR_NEW_TES (1 << 20)
59#define SWR_NEW_TS (1 << 21)
60#define SWR_NEW_TCSCONSTANTS (1 << 22)
61#define SWR_NEW_TESCONSTANTS (1 << 23)
62
63namespace std
64{
65template <> struct hash<BLEND_COMPILE_STATE> {
66   std::size_t operator()(const BLEND_COMPILE_STATE &k) const
67   {
68      return util_hash_crc32(&k, sizeof(k));
69   }
70};
71};
72
73struct swr_jit_texture {
74   uint32_t width; // same as number of elements
75   uint32_t height;
76   uint32_t depth; // doubles as array size
77   uint32_t first_level;
78   uint32_t last_level;
79   const uint8_t *base_ptr;
80   uint32_t num_samples;
81   uint32_t sample_stride;
82   uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
83   uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
84   uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
85};
86
87struct swr_jit_sampler {
88   float min_lod;
89   float max_lod;
90   float lod_bias;
91   float border_color[4];
92};
93
94struct swr_draw_context {
95   const float *constantVS[PIPE_MAX_CONSTANT_BUFFERS];
96   uint32_t num_constantsVS[PIPE_MAX_CONSTANT_BUFFERS];
97   const float *constantFS[PIPE_MAX_CONSTANT_BUFFERS];
98   uint32_t num_constantsFS[PIPE_MAX_CONSTANT_BUFFERS];
99   const float *constantGS[PIPE_MAX_CONSTANT_BUFFERS];
100   uint32_t num_constantsGS[PIPE_MAX_CONSTANT_BUFFERS];
101   const float *constantTCS[PIPE_MAX_CONSTANT_BUFFERS];
102   uint32_t num_constantsTCS[PIPE_MAX_CONSTANT_BUFFERS];
103   const float *constantTES[PIPE_MAX_CONSTANT_BUFFERS];
104   uint32_t num_constantsTES[PIPE_MAX_CONSTANT_BUFFERS];
105
106   swr_jit_texture texturesVS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
107   swr_jit_sampler samplersVS[PIPE_MAX_SAMPLERS];
108   swr_jit_texture texturesFS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
109   swr_jit_sampler samplersFS[PIPE_MAX_SAMPLERS];
110   swr_jit_texture texturesGS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
111   swr_jit_sampler samplersGS[PIPE_MAX_SAMPLERS];
112   swr_jit_texture texturesTCS[PIPE_MAX_SHADER_SAMPLER_VIEWS];
113   swr_jit_sampler samplersTCS[PIPE_MAX_SAMPLERS];
114   swr_jit_texture texturesTES[PIPE_MAX_SHADER_SAMPLER_VIEWS];
115   swr_jit_sampler samplersTES[PIPE_MAX_SAMPLERS];
116
117   float userClipPlanes[PIPE_MAX_CLIP_PLANES][4];
118
119   uint32_t polyStipple[32];
120
121   SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS];
122   struct swr_query_result *pStats; // @llvm_struct
123   SWR_INTERFACE *pAPI; // @llvm_struct - Needed for the swr_memory callbacks
124   SWR_TILE_INTERFACE *pTileAPI; // @llvm_struct - Needed for the swr_memory callbacks
125
126   uint64_t* soPrims; //number of primitives written to StreamOut buffer
127};
128
129/* gen_llvm_types FINI */
130
131struct swr_context {
132   struct pipe_context pipe; /**< base class */
133
134   HANDLE swrContext;
135
136   SWR_TS_STATE tsState;
137
138   /** Constant state objects */
139   struct swr_blend_state *blend;
140   struct pipe_sampler_state *samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
141   struct pipe_depth_stencil_alpha_state *depth_stencil;
142   struct pipe_rasterizer_state *rasterizer;
143
144   struct swr_vertex_shader *vs;
145   struct swr_fragment_shader *fs;
146   struct swr_geometry_shader *gs;
147   struct swr_tess_control_shader *tcs;
148   struct swr_tess_evaluation_shader *tes;
149   struct swr_vertex_element_state *velems;
150
151   /** Other rendering state */
152   struct pipe_blend_color blend_color;
153   struct pipe_stencil_ref stencil_ref;
154   struct pipe_clip_state clip;
155   struct pipe_constant_buffer
156      constants[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS];
157   struct pipe_framebuffer_state framebuffer;
158   struct swr_poly_stipple poly_stipple;
159   struct pipe_scissor_state scissors[KNOB_NUM_VIEWPORTS_SCISSORS];
160   SWR_RECT swr_scissors[KNOB_NUM_VIEWPORTS_SCISSORS];
161   struct pipe_sampler_view *
162      sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_SAMPLER_VIEWS];
163
164   struct pipe_viewport_state viewports[KNOB_NUM_VIEWPORTS_SCISSORS];
165   struct pipe_vertex_buffer vertex_buffer[PIPE_MAX_ATTRIBS];
166
167   struct blitter_context *blitter;
168
169   /** Conditional query object and mode */
170   struct pipe_query *render_cond_query;
171   enum pipe_render_cond_flag render_cond_mode;
172   bool render_cond_cond;
173   unsigned active_queries;
174
175   unsigned num_vertex_buffers;
176   unsigned num_samplers[PIPE_SHADER_TYPES];
177   unsigned num_sampler_views[PIPE_SHADER_TYPES];
178
179   unsigned sample_mask;
180
181   // streamout
182   pipe_stream_output_target *so_targets[MAX_SO_STREAMS];
183   uint32_t num_so_targets;
184   uint64_t so_primCounter; // number of primitives written to StreamOut buffer
185
186   /* Temp storage for user_buffer constants */
187   struct swr_scratch_buffers *scratch;
188
189   // blend jit functions
190   std::unordered_map<BLEND_COMPILE_STATE, PFN_BLEND_JIT_FUNC> *blendJIT;
191
192   /* Derived SWR API DrawState */
193   struct swr_derived_state derived;
194
195   /* SWR private state - draw context */
196   struct swr_draw_context swrDC;
197
198   unsigned dirty; /**< Mask of SWR_NEW_x flags */
199
200   SWR_INTERFACE api;
201   SWR_TILE_INTERFACE tileApi;
202
203   uint32_t max_draws_in_flight;
204   uint8_t patch_vertices;
205};
206
207static INLINE struct swr_context *
208swr_context(struct pipe_context *pipe)
209{
210   return (struct swr_context *)pipe;
211}
212
213static INLINE void
214swr_update_draw_context(struct swr_context *ctx,
215      struct swr_query_result *pqr = nullptr)
216{
217   swr_draw_context *pDC =
218      (swr_draw_context *)ctx->api.pfnSwrGetPrivateContextState(ctx->swrContext);
219   if (pqr)
220      ctx->swrDC.pStats = pqr;
221   memcpy(pDC, &ctx->swrDC, sizeof(swr_draw_context));
222}
223
224struct pipe_context *swr_create_context(struct pipe_screen *, void *priv, unsigned flags);
225
226void swr_state_init(struct pipe_context *pipe);
227
228void swr_clear_init(struct pipe_context *pipe);
229
230void swr_draw_init(struct pipe_context *pipe);
231
232void swr_finish(struct pipe_context *pipe);
233
234void swr_do_msaa_resolve(struct pipe_resource *src_resource,
235                         struct pipe_resource *dst_resource);
236#endif
237