• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2019 Lima Project
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, sub license,
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
12  * next paragraph) shall be included in all copies or substantial portions
13  * of the 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 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
21  * DEALINGS IN THE SOFTWARE.
22  *
23  */
24 
25 #ifndef H_LIMA_CONTEXT
26 #define H_LIMA_CONTEXT
27 
28 #include "util/list.h"
29 #include "util/slab.h"
30 
31 #include "pipe/p_context.h"
32 #include "pipe/p_state.h"
33 
34 struct lima_context_framebuffer {
35    struct pipe_framebuffer_state base;
36    int tiled_w, tiled_h;
37    int shift_w, shift_h;
38    int block_w, block_h;
39    int shift_min;
40 };
41 
42 struct lima_depth_stencil_alpha_state {
43    struct pipe_depth_stencil_alpha_state base;
44 };
45 
46 struct lima_fs_shader_state {
47    struct pipe_shader_state base;
48    void *shader;
49    int shader_size;
50    int stack_size;
51    uint8_t swizzles[PIPE_MAX_SAMPLERS][4];
52    bool uses_discard;
53    struct lima_bo *bo;
54 };
55 
56 #define LIMA_MAX_VARYING_NUM 13
57 
58 struct lima_varying_info {
59    int components;
60    int component_size;
61    int offset;
62 };
63 
64 struct lima_vs_shader_state {
65    void *shader;
66    int shader_size;
67    int prefetch;
68 
69    int uniform_size;
70    void *constant;
71    int constant_size;
72 
73    struct lima_varying_info varying[LIMA_MAX_VARYING_NUM];
74    int varying_stride;
75    int num_outputs;
76    int num_varyings;
77    int gl_pos_idx;
78    int point_size_idx;
79 
80    struct lima_bo *bo;
81 };
82 
83 struct lima_rasterizer_state {
84    struct pipe_rasterizer_state base;
85 };
86 
87 struct lima_blend_state {
88    struct pipe_blend_state base;
89 };
90 
91 struct lima_vertex_element_state {
92    struct pipe_vertex_element pipe[PIPE_MAX_ATTRIBS];
93    unsigned num_elements;
94 };
95 
96 struct lima_context_vertex_buffer {
97    struct pipe_vertex_buffer vb[PIPE_MAX_ATTRIBS];
98    unsigned count;
99    uint32_t enabled_mask;
100 };
101 
102 struct lima_context_viewport_state {
103    struct pipe_viewport_state transform;
104    float left, right, bottom, top;
105    float near, far;
106 };
107 
108 struct lima_context_constant_buffer {
109    const void *buffer;
110    uint32_t size;
111    bool dirty;
112 };
113 
114 enum lima_ctx_buff {
115    lima_ctx_buff_gp_varying_info,
116    lima_ctx_buff_gp_attribute_info,
117    lima_ctx_buff_gp_uniform,
118    lima_ctx_buff_pp_plb_rsw,
119    lima_ctx_buff_pp_uniform_array,
120    lima_ctx_buff_pp_uniform,
121    lima_ctx_buff_pp_tex_desc,
122    lima_ctx_buff_num,
123    lima_ctx_buff_num_gp = lima_ctx_buff_pp_plb_rsw,
124 };
125 
126 struct lima_ctx_buff_state {
127    struct pipe_resource *res;
128    unsigned offset;
129    unsigned size;
130 };
131 
132 struct lima_texture_stateobj {
133    struct pipe_sampler_view *textures[PIPE_MAX_SAMPLERS];
134    unsigned num_textures;
135    struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS];
136    unsigned num_samplers;
137 };
138 
139 struct lima_ctx_plb_pp_stream_key {
140    uint16_t plb_index;
141    /* Coordinates are in tiles */
142    uint16_t minx, miny, maxx, maxy;
143    /* FB params */
144    uint16_t shift_w, shift_h;
145    uint16_t block_w, block_h;
146 };
147 
148 struct lima_ctx_plb_pp_stream {
149    struct list_head lru_list;
150    struct lima_ctx_plb_pp_stream_key key;
151    struct lima_bo *bo;
152    uint32_t offset[8];
153 };
154 
155 struct lima_pp_stream_state {
156    void *map;
157    uint32_t va;
158    uint32_t offset[8];
159 };
160 
161 struct lima_context {
162    struct pipe_context base;
163 
164    enum {
165       LIMA_CONTEXT_DIRTY_FRAMEBUFFER  = (1 << 0),
166       LIMA_CONTEXT_DIRTY_CLEAR        = (1 << 1),
167       LIMA_CONTEXT_DIRTY_SHADER_VERT  = (1 << 2),
168       LIMA_CONTEXT_DIRTY_SHADER_FRAG  = (1 << 3),
169       LIMA_CONTEXT_DIRTY_VERTEX_ELEM  = (1 << 4),
170       LIMA_CONTEXT_DIRTY_VERTEX_BUFF  = (1 << 5),
171       LIMA_CONTEXT_DIRTY_VIEWPORT     = (1 << 6),
172       LIMA_CONTEXT_DIRTY_SCISSOR      = (1 << 7),
173       LIMA_CONTEXT_DIRTY_RASTERIZER   = (1 << 8),
174       LIMA_CONTEXT_DIRTY_ZSA          = (1 << 9),
175       LIMA_CONTEXT_DIRTY_BLEND_COLOR  = (1 << 10),
176       LIMA_CONTEXT_DIRTY_BLEND        = (1 << 11),
177       LIMA_CONTEXT_DIRTY_STENCIL_REF  = (1 << 12),
178       LIMA_CONTEXT_DIRTY_CONST_BUFF   = (1 << 13),
179       LIMA_CONTEXT_DIRTY_TEXTURES     = (1 << 14),
180    } dirty;
181 
182    struct u_upload_mgr *uploader;
183    struct blitter_context *blitter;
184 
185    struct slab_child_pool transfer_pool;
186 
187    struct lima_context_framebuffer framebuffer;
188    struct lima_context_viewport_state viewport;
189    struct pipe_scissor_state scissor;
190    struct pipe_scissor_state clipped_scissor;
191    struct lima_vs_shader_state *vs;
192    struct lima_fs_shader_state *fs;
193    struct lima_vertex_element_state *vertex_elements;
194    struct lima_context_vertex_buffer vertex_buffers;
195    struct lima_rasterizer_state *rasterizer;
196    struct lima_depth_stencil_alpha_state *zsa;
197    struct pipe_blend_color blend_color;
198    struct lima_blend_state *blend;
199    struct pipe_stencil_ref stencil_ref;
200    struct lima_context_constant_buffer const_buffer[PIPE_SHADER_TYPES];
201    struct lima_texture_stateobj tex_stateobj;
202    struct lima_pp_stream_state pp_stream;
203 
204    unsigned min_index;
205    unsigned max_index;
206 
207    #define LIMA_CTX_PLB_MIN_NUM  1
208    #define LIMA_CTX_PLB_MAX_NUM  4
209    #define LIMA_CTX_PLB_DEF_NUM  2
210    #define LIMA_CTX_PLB_BLK_SIZE 512
211    unsigned plb_size;
212    unsigned plb_gp_size;
213 
214    struct lima_bo *plb[LIMA_CTX_PLB_MAX_NUM];
215    struct lima_bo *gp_tile_heap[LIMA_CTX_PLB_MAX_NUM];
216    uint32_t gp_tile_heap_size;
217    struct lima_bo *plb_gp_stream;
218    struct lima_bo *gp_output;
219    uint32_t gp_output_varyings_offt;
220    uint32_t gp_output_point_size_offt;
221 
222    struct hash_table *plb_pp_stream;
223    struct list_head plb_pp_stream_lru_list;
224    uint32_t plb_index;
225    size_t plb_stream_cache_size;
226 
227    struct lima_ctx_buff_state buffer_state[lima_ctx_buff_num];
228 
229    /* current job */
230    struct lima_job *job;
231 
232    /* map from lima_job_key to lima_job */
233    struct hash_table *jobs;
234 
235    /* map from pipe_resource to lima_job which write to it */
236    struct hash_table *write_jobs;
237 
238    int in_sync_fd;
239    uint32_t in_sync[2];
240    uint32_t out_sync[2];
241 
242    int id;
243 
244    struct pipe_debug_callback debug;
245 
246    unsigned index_offset;
247    struct lima_resource *index_res;
248 };
249 
250 static inline struct lima_context *
lima_context(struct pipe_context * pctx)251 lima_context(struct pipe_context *pctx)
252 {
253    return (struct lima_context *)pctx;
254 }
255 
256 struct lima_sampler_state {
257    struct pipe_sampler_state base;
258 };
259 
260 static inline struct lima_sampler_state *
lima_sampler_state(struct pipe_sampler_state * psstate)261 lima_sampler_state(struct pipe_sampler_state *psstate)
262 {
263    return (struct lima_sampler_state *)psstate;
264 }
265 
266 struct lima_sampler_view {
267    struct pipe_sampler_view base;
268 };
269 
270 static inline struct lima_sampler_view *
lima_sampler_view(struct pipe_sampler_view * psview)271 lima_sampler_view(struct pipe_sampler_view *psview)
272 {
273    return (struct lima_sampler_view *)psview;
274 }
275 
276 uint32_t lima_ctx_buff_va(struct lima_context *ctx, enum lima_ctx_buff buff);
277 void *lima_ctx_buff_map(struct lima_context *ctx, enum lima_ctx_buff buff);
278 void *lima_ctx_buff_alloc(struct lima_context *ctx, enum lima_ctx_buff buff,
279                           unsigned size);
280 
281 void lima_state_init(struct lima_context *ctx);
282 void lima_state_fini(struct lima_context *ctx);
283 void lima_draw_init(struct lima_context *ctx);
284 void lima_program_init(struct lima_context *ctx);
285 void lima_query_init(struct lima_context *ctx);
286 
287 struct pipe_context *
288 lima_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags);
289 
290 void lima_flush(struct lima_context *ctx);
291 void lima_flush_job_accessing_bo(
292    struct lima_context *ctx, struct lima_bo *bo, bool write);
293 void lima_flush_previous_job_writing_resource(
294    struct lima_context *ctx, struct pipe_resource *prsc);
295 
296 #endif
297