1/************************************************************************** 2 * 3 * Copyright 2003 VMware, Inc. 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28#ifndef ST_CONTEXT_H 29#define ST_CONTEXT_H 30 31#include "main/arrayobj.h" 32#include "main/mtypes.h" 33#include "state_tracker/st_api.h" 34#include "main/fbobject.h" 35#include "state_tracker/st_atom.h" 36#include "util/u_helpers.h" 37#include "util/u_inlines.h" 38#include "util/list.h" 39#include "vbo/vbo.h" 40#include "util/list.h" 41 42 43#ifdef __cplusplus 44extern "C" { 45#endif 46 47 48struct dd_function_table; 49struct draw_context; 50struct draw_stage; 51struct gen_mipmap_state; 52struct st_context; 53struct st_fragment_program; 54struct st_perf_monitor_group; 55struct u_upload_mgr; 56 57 58struct st_bitmap_cache 59{ 60 /** Window pos to render the cached image */ 61 GLint xpos, ypos; 62 /** Bounds of region used in window coords */ 63 GLint xmin, ymin, xmax, ymax; 64 65 GLfloat color[4]; 66 67 /** Bitmap's Z position */ 68 GLfloat zpos; 69 70 struct pipe_resource *texture; 71 struct pipe_transfer *trans; 72 73 GLboolean empty; 74 75 /** An I8 texture image: */ 76 ubyte *buffer; 77}; 78 79struct st_bound_handles 80{ 81 unsigned num_handles; 82 uint64_t *handles; 83}; 84 85 86#define NUM_DRAWPIX_CACHE_ENTRIES 4 87 88struct drawpix_cache_entry 89{ 90 GLsizei width, height; 91 GLenum format, type; 92 const void *user_pointer; /**< Last user 'pixels' pointer */ 93 void *image; /**< Copy of the glDrawPixels image data */ 94 struct pipe_resource *texture; 95 unsigned age; 96}; 97 98 99/* 100 * Node for a linked list of dead sampler views. 101 */ 102struct st_zombie_sampler_view_node 103{ 104 struct pipe_sampler_view *view; 105 struct list_head node; 106}; 107 108 109/* 110 * Node for a linked list of dead shaders. 111 */ 112struct st_zombie_shader_node 113{ 114 void *shader; 115 enum pipe_shader_type type; 116 struct list_head node; 117}; 118 119 120struct st_context 121{ 122 struct st_context_iface iface; 123 124 struct gl_context *ctx; 125 126 struct pipe_context *pipe; 127 128 struct draw_context *draw; /**< For selection/feedback/rastpos only */ 129 struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */ 130 struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */ 131 struct draw_stage *rastpos_stage; /**< For glRasterPos */ 132 GLboolean clamp_frag_color_in_shader; 133 GLboolean clamp_vert_color_in_shader; 134 boolean has_stencil_export; /**< can do shader stencil export? */ 135 boolean has_time_elapsed; 136 boolean has_shader_model3; 137 boolean has_etc1; 138 boolean has_etc2; 139 boolean has_astc_2d_ldr; 140 boolean prefer_blit_based_texture_transfer; 141 boolean force_persample_in_shader; 142 boolean has_shareable_shaders; 143 boolean has_half_float_packing; 144 boolean has_multi_draw_indirect; 145 boolean has_single_pipe_stat; 146 boolean has_indep_blend_func; 147 boolean needs_rgb_dst_alpha_override; 148 boolean can_bind_const_buffer_as_vertex; 149 150 /** 151 * If a shader can be created when we get its source. 152 * This means it has only 1 variant, not counting glBitmap and 153 * glDrawPixels. 154 */ 155 boolean shader_has_one_variant[MESA_SHADER_STAGES]; 156 157 boolean needs_texcoord_semantic; 158 boolean apply_texture_swizzle_to_border_color; 159 160 /* On old libGL's for linux we need to invalidate the drawables 161 * on glViewpport calls, this is set via a option. 162 */ 163 boolean invalidate_on_gl_viewport; 164 boolean draw_needs_minmax_index; 165 boolean has_hw_atomics; 166 167 /* Some state is contained in constant objects. 168 * Other state is just parameter values. 169 */ 170 struct { 171 struct pipe_blend_state blend; 172 struct pipe_depth_stencil_alpha_state depth_stencil; 173 struct pipe_rasterizer_state rasterizer; 174 struct pipe_sampler_state frag_samplers[PIPE_MAX_SAMPLERS]; 175 GLuint num_frag_samplers; 176 struct pipe_sampler_view *frag_sampler_views[PIPE_MAX_SAMPLERS]; 177 GLuint num_sampler_views[PIPE_SHADER_TYPES]; 178 struct pipe_clip_state clip; 179 struct { 180 void *ptr; 181 unsigned size; 182 } constants[PIPE_SHADER_TYPES]; 183 unsigned fb_width; 184 unsigned fb_height; 185 unsigned fb_num_samples; 186 unsigned fb_num_layers; 187 unsigned fb_num_cb; 188 unsigned num_viewports; 189 struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS]; 190 struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS]; 191 struct { 192 unsigned num; 193 boolean include; 194 struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES]; 195 } window_rects; 196 197 GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */ 198 199 GLuint fb_orientation; 200 201 bool enable_sample_locations; 202 unsigned sample_locations_samples; 203 uint8_t sample_locations[ 204 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * 205 PIPE_MAX_SAMPLE_LOCATION_GRID_SIZE * 32]; 206 } state; 207 208 uint64_t dirty; /**< dirty states */ 209 210 /** This masks out unused shader resources. Only valid in draw calls. */ 211 uint64_t active_states; 212 213 unsigned pin_thread_counter; /* for L3 thread pinning on AMD Zen */ 214 215 /* If true, further analysis of states is required to know if something 216 * has changed. Used mainly for shaders. 217 */ 218 bool gfx_shaders_may_be_dirty; 219 bool compute_shader_may_be_dirty; 220 221 GLboolean vertdata_edgeflags; 222 GLboolean edgeflag_culls_prims; 223 224 struct st_vertex_program *vp; /**< Currently bound vertex program */ 225 struct st_fragment_program *fp; /**< Currently bound fragment program */ 226 struct st_common_program *gp; /**< Currently bound geometry program */ 227 struct st_common_program *tcp; /**< Currently bound tess control program */ 228 struct st_common_program *tep; /**< Currently bound tess eval program */ 229 struct st_compute_program *cp; /**< Currently bound compute program */ 230 231 struct st_vp_variant *vp_variant; 232 233 struct { 234 struct pipe_resource *pixelmap_texture; 235 struct pipe_sampler_view *pixelmap_sampler_view; 236 } pixel_xfer; 237 238 /** for glBitmap */ 239 struct { 240 struct pipe_rasterizer_state rasterizer; 241 struct pipe_sampler_state sampler; 242 struct pipe_sampler_state atlas_sampler; 243 enum pipe_format tex_format; 244 struct st_bitmap_cache cache; 245 } bitmap; 246 247 /** for glDraw/CopyPixels */ 248 struct { 249 void *zs_shaders[4]; 250 } drawpix; 251 252 /** Cache of glDrawPixels images */ 253 struct { 254 struct drawpix_cache_entry entries[NUM_DRAWPIX_CACHE_ENTRIES]; 255 unsigned age; 256 } drawpix_cache; 257 258 /** for glReadPixels */ 259 struct { 260 struct pipe_resource *src; 261 struct pipe_resource *cache; 262 enum pipe_format dst_format; 263 unsigned level; 264 unsigned layer; 265 unsigned hits; 266 } readpix_cache; 267 268 /** for glClear */ 269 struct { 270 struct pipe_rasterizer_state raster; 271 struct pipe_viewport_state viewport; 272 void *vs; 273 void *fs; 274 void *vs_layered; 275 void *gs_layered; 276 } clear; 277 278 /* For gl(Compressed)Tex(Sub)Image */ 279 struct { 280 struct pipe_rasterizer_state raster; 281 struct pipe_blend_state upload_blend; 282 void *vs; 283 void *gs; 284 void *upload_fs[3]; 285 void *download_fs[3][PIPE_MAX_TEXTURE_TYPES]; 286 bool upload_enabled; 287 bool download_enabled; 288 bool rgba_only; 289 bool layers; 290 bool use_gs; 291 } pbo; 292 293 /** for drawing with st_util_vertex */ 294 struct pipe_vertex_element util_velems[3]; 295 296 /** passthrough vertex shader matching the util_velem attributes */ 297 void *passthrough_vs; 298 299 enum pipe_texture_target internal_target; 300 301 struct cso_context *cso_context; 302 303 void *winsys_drawable_handle; 304 305 /* The number of vertex buffers from the last call of validate_arrays. */ 306 unsigned last_num_vbuffers; 307 308 int32_t draw_stamp; 309 int32_t read_stamp; 310 311 struct st_config_options options; 312 313 struct st_perf_monitor_group *perfmon; 314 315 enum pipe_reset_status reset_status; 316 317 /* Array of bound texture/image handles which are resident in the context. 318 */ 319 struct st_bound_handles bound_texture_handles[PIPE_SHADER_TYPES]; 320 struct st_bound_handles bound_image_handles[PIPE_SHADER_TYPES]; 321 322 /* Winsys buffers */ 323 struct list_head winsys_buffers; 324 325 /* Throttling for texture uploads and similar operations to limit memory 326 * usage by limiting the number of in-flight operations based on 327 * the estimated allocated size needed to execute those operations. 328 */ 329 struct util_throttle throttle; 330 331 struct { 332 struct st_zombie_sampler_view_node list; 333 mtx_t mutex; 334 } zombie_sampler_views; 335 336 struct { 337 struct st_zombie_shader_node list; 338 mtx_t mutex; 339 } zombie_shaders; 340 341}; 342 343 344/* 345 * Get the state tracker context for the given Mesa context. 346 */ 347static inline struct st_context * 348st_context(struct gl_context *ctx) 349{ 350 return ctx->st; 351} 352 353 354extern struct st_context * 355st_create_context(gl_api api, struct pipe_context *pipe, 356 const struct gl_config *visual, 357 struct st_context *share, 358 const struct st_config_options *options, 359 bool no_error); 360 361extern void 362st_destroy_context(struct st_context *st); 363 364 365extern void 366st_invalidate_buffers(struct st_context *st); 367 368 369extern void 370st_save_zombie_sampler_view(struct st_context *st, 371 struct pipe_sampler_view *view); 372 373extern void 374st_save_zombie_shader(struct st_context *st, 375 enum pipe_shader_type type, 376 struct pipe_shader_state *shader); 377 378 379void 380st_context_free_zombie_objects(struct st_context *st); 381 382 383 384/** 385 * Wrapper for struct gl_framebuffer. 386 * This is an opaque type to the outside world. 387 */ 388struct st_framebuffer 389{ 390 struct gl_framebuffer Base; 391 392 struct st_framebuffer_iface *iface; 393 enum st_attachment_type statts[ST_ATTACHMENT_COUNT]; 394 unsigned num_statts; 395 int32_t stamp; 396 int32_t iface_stamp; 397 uint32_t iface_ID; 398 399 /* list of framebuffer objects */ 400 struct list_head head; 401}; 402 403 404#ifdef __cplusplus 405} 406#endif 407 408#endif 409