• 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