2 * Copyright (c) 2017-2019 Lima Project
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:
11 * The above copyright notice and this permission notice (including the
12 * next paragraph) shall be included in all copies or substantial portions
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.
25 #ifndef H_LIMA_CONTEXT
26 #define H_LIMA_CONTEXT
28 #include "util/list.h"
29 #include "util/slab.h"
31 #include "pipe/p_context.h"
32 #include "pipe/p_state.h"
34 struct lima_context_framebuffer
{
35 struct pipe_framebuffer_state base
;
42 struct lima_depth_stencil_alpha_state
{
43 struct pipe_depth_stencil_alpha_state base
;
46 struct lima_fs_shader_state
{
47 struct pipe_shader_state base
;
51 uint8_t swizzles
[PIPE_MAX_SAMPLERS
][4];
56 #define LIMA_MAX_VARYING_NUM 13
58 struct lima_varying_info
{
64 struct lima_vs_shader_state
{
69 /* pipe_constant_buffer.size is aligned with some pad bytes,
70 * so record here for the real start place of gpir lowered
72 int uniform_pending_offset
;
77 struct lima_varying_info varying
[LIMA_MAX_VARYING_NUM
];
87 struct lima_rasterizer_state
{
88 struct pipe_rasterizer_state base
;
91 struct lima_blend_state
{
92 struct pipe_blend_state base
;
95 struct lima_vertex_element_state
{
96 struct pipe_vertex_element pipe
[PIPE_MAX_ATTRIBS
];
97 unsigned num_elements
;
100 struct lima_context_vertex_buffer
{
101 struct pipe_vertex_buffer vb
[PIPE_MAX_ATTRIBS
];
103 uint32_t enabled_mask
;
106 struct lima_context_viewport_state
{
107 struct pipe_viewport_state transform
;
108 float left
, right
, bottom
, top
;
112 struct lima_context_constant_buffer
{
119 lima_ctx_buff_gp_varying_info
,
120 lima_ctx_buff_gp_attribute_info
,
121 lima_ctx_buff_gp_uniform
,
122 lima_ctx_buff_pp_plb_rsw
,
123 lima_ctx_buff_pp_uniform_array
,
124 lima_ctx_buff_pp_uniform
,
125 lima_ctx_buff_pp_tex_desc
,
127 lima_ctx_buff_num_gp
= lima_ctx_buff_pp_plb_rsw
,
130 struct lima_ctx_buff_state
{
131 struct pipe_resource
*res
;
136 struct lima_texture_stateobj
{
137 struct pipe_sampler_view
*textures
[PIPE_MAX_SAMPLERS
];
138 unsigned num_textures
;
139 struct pipe_sampler_state
*samplers
[PIPE_MAX_SAMPLERS
];
140 unsigned num_samplers
;
143 struct lima_ctx_plb_pp_stream_key
{
145 /* Coordinates are in tiles */
146 uint16_t minx
, miny
, maxx
, maxy
;
148 uint16_t shift_w
, shift_h
;
149 uint16_t block_w
, block_h
;
152 struct lima_ctx_plb_pp_stream
{
153 struct list_head lru_list
;
154 struct lima_ctx_plb_pp_stream_key key
;
159 struct lima_pp_stream_state
{
165 struct lima_context
{
166 struct pipe_context base
;
169 LIMA_CONTEXT_DIRTY_FRAMEBUFFER
= (1 << 0),
170 LIMA_CONTEXT_DIRTY_CLEAR
= (1 << 1),
171 LIMA_CONTEXT_DIRTY_SHADER_VERT
= (1 << 2),
172 LIMA_CONTEXT_DIRTY_SHADER_FRAG
= (1 << 3),
173 LIMA_CONTEXT_DIRTY_VERTEX_ELEM
= (1 << 4),
174 LIMA_CONTEXT_DIRTY_VERTEX_BUFF
= (1 << 5),
175 LIMA_CONTEXT_DIRTY_VIEWPORT
= (1 << 6),
176 LIMA_CONTEXT_DIRTY_SCISSOR
= (1 << 7),
177 LIMA_CONTEXT_DIRTY_RASTERIZER
= (1 << 8),
178 LIMA_CONTEXT_DIRTY_ZSA
= (1 << 9),
179 LIMA_CONTEXT_DIRTY_BLEND_COLOR
= (1 << 10),
180 LIMA_CONTEXT_DIRTY_BLEND
= (1 << 11),
181 LIMA_CONTEXT_DIRTY_STENCIL_REF
= (1 << 12),
182 LIMA_CONTEXT_DIRTY_CONST_BUFF
= (1 << 13),
183 LIMA_CONTEXT_DIRTY_TEXTURES
= (1 << 14),
186 struct u_upload_mgr
*uploader
;
187 struct blitter_context
*blitter
;
189 struct slab_child_pool transfer_pool
;
191 struct lima_context_framebuffer framebuffer
;
192 struct lima_context_viewport_state viewport
;
193 struct pipe_scissor_state scissor
;
194 struct pipe_scissor_state clipped_scissor
;
195 struct lima_vs_shader_state
*vs
;
196 struct lima_fs_shader_state
*fs
;
197 struct lima_vertex_element_state
*vertex_elements
;
198 struct lima_context_vertex_buffer vertex_buffers
;
199 struct lima_rasterizer_state
*rasterizer
;
200 struct lima_depth_stencil_alpha_state
*zsa
;
201 struct pipe_blend_color blend_color
;
202 struct lima_blend_state
*blend
;
203 struct pipe_stencil_ref stencil_ref
;
204 struct lima_context_constant_buffer const_buffer
[PIPE_SHADER_TYPES
];
205 struct lima_texture_stateobj tex_stateobj
;
206 struct lima_pp_stream_state pp_stream
;
211 #define LIMA_CTX_PLB_MIN_NUM 1
212 #define LIMA_CTX_PLB_MAX_NUM 4
213 #define LIMA_CTX_PLB_DEF_NUM 2
214 #define LIMA_CTX_PLB_BLK_SIZE 512
216 unsigned plb_gp_size
;
218 struct lima_bo
*plb
[LIMA_CTX_PLB_MAX_NUM
];
219 struct lima_bo
*gp_tile_heap
[LIMA_CTX_PLB_MAX_NUM
];
220 uint32_t gp_tile_heap_size
;
221 struct lima_bo
*plb_gp_stream
;
222 struct lima_bo
*gp_output
;
223 uint32_t gp_output_varyings_offt
;
224 uint32_t gp_output_point_size_offt
;
226 struct hash_table
*plb_pp_stream
;
227 struct list_head plb_pp_stream_lru_list
;
229 size_t plb_stream_cache_size
;
231 struct lima_ctx_buff_state buffer_state
[lima_ctx_buff_num
];
234 struct lima_job
*job
;
236 /* map from lima_job_key to lima_job */
237 struct hash_table
*jobs
;
239 /* map from pipe_resource to lima_job which write to it */
240 struct hash_table
*write_jobs
;
244 uint32_t out_sync
[2];
248 struct pipe_debug_callback debug
;
250 unsigned index_offset
;
251 struct lima_resource
*index_res
;
254 static inline struct lima_context
*
255 lima_context(struct pipe_context
*pctx
)
257 return (struct lima_context
*)pctx
;
260 struct lima_sampler_state
{
261 struct pipe_sampler_state base
;
264 static inline struct lima_sampler_state
*
265 lima_sampler_state(struct pipe_sampler_state
*psstate
)
267 return (struct lima_sampler_state
*)psstate
;
270 struct lima_sampler_view
{
271 struct pipe_sampler_view base
;
274 static inline struct lima_sampler_view
*
275 lima_sampler_view(struct pipe_sampler_view
*psview
)
277 return (struct lima_sampler_view
*)psview
;
280 uint32_t lima_ctx_buff_va(struct lima_context
*ctx
, enum lima_ctx_buff buff
);
281 void *lima_ctx_buff_map(struct lima_context
*ctx
, enum lima_ctx_buff buff
);
282 void *lima_ctx_buff_alloc(struct lima_context
*ctx
, enum lima_ctx_buff buff
,
285 void lima_state_init(struct lima_context
*ctx
);
286 void lima_state_fini(struct lima_context
*ctx
);
287 void lima_draw_init(struct lima_context
*ctx
);
288 void lima_program_init(struct lima_context
*ctx
);
289 void lima_query_init(struct lima_context
*ctx
);
291 struct pipe_context
*
292 lima_context_create(struct pipe_screen
*pscreen
, void *priv
, unsigned flags
);
294 void lima_flush(struct lima_context
*ctx
);
295 void lima_flush_job_accessing_bo(
296 struct lima_context
*ctx
, struct lima_bo
*bo
, bool write
);
297 void lima_flush_previous_job_writing_resource(
298 struct lima_context
*ctx
, struct pipe_resource
*prsc
);