1/********************************************************** 2 * Copyright 2010 VMware, Inc. All rights reserved. 3 * 4 * Permission is hereby granted, free of charge, to any person 5 * obtaining a copy of this software and associated documentation 6 * files (the "Software"), to deal in the Software without 7 * restriction, including without limitation the rights to use, copy, 8 * modify, merge, publish, distribute, sublicense, and/or sell copies 9 * of the Software, and to permit persons to whom the Software is 10 * furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 * 24 **********************************************************/ 25 26 27#ifndef _API_H_ 28#define _API_H_ 29 30#include "pipe/p_format.h" 31 32/** 33 * \file API for communication between gallium frontends and supporting 34 * frontends such as DRI. 35 * 36 * This file defines an API to be implemented by both gallium frontends and 37 * their managers. 38 */ 39 40/** 41 * The supported rendering API. 42 */ 43enum st_api_type { 44 ST_API_OPENGL, 45 ST_API_OPENVG, 46 47 ST_API_COUNT 48}; 49 50/** 51 * The profile of a context. 52 */ 53enum st_profile_type 54{ 55 ST_PROFILE_DEFAULT, /**< OpenGL compatibility profile */ 56 ST_PROFILE_OPENGL_CORE, /**< OpenGL 3.2+ core profile */ 57 ST_PROFILE_OPENGL_ES1, /**< OpenGL ES 1.x */ 58 ST_PROFILE_OPENGL_ES2 /**< OpenGL ES 2.0 */ 59}; 60 61/* for profile_mask in st_api */ 62#define ST_PROFILE_DEFAULT_MASK (1 << ST_PROFILE_DEFAULT) 63#define ST_PROFILE_OPENGL_CORE_MASK (1 << ST_PROFILE_OPENGL_CORE) 64#define ST_PROFILE_OPENGL_ES1_MASK (1 << ST_PROFILE_OPENGL_ES1) 65#define ST_PROFILE_OPENGL_ES2_MASK (1 << ST_PROFILE_OPENGL_ES2) 66 67/** 68 * Optional API features. 69 */ 70enum st_api_feature 71{ 72 ST_API_FEATURE_MS_VISUALS /**< support for multisample visuals */ 73}; 74 75/* for feature_mask in st_api */ 76#define ST_API_FEATURE_MS_VISUALS_MASK (1 << ST_API_FEATURE_MS_VISUALS) 77 78/** 79 * New context flags for GL 3.0 and beyond. 80 * 81 * Profile information (core vs. compatibilty for OpenGL 3.2+) is communicated 82 * through the \c st_profile_type, not through flags. 83 */ 84#define ST_CONTEXT_FLAG_DEBUG (1 << 0) 85#define ST_CONTEXT_FLAG_FORWARD_COMPATIBLE (1 << 1) 86#define ST_CONTEXT_FLAG_ROBUST_ACCESS (1 << 2) 87#define ST_CONTEXT_FLAG_RESET_NOTIFICATION_ENABLED (1 << 3) 88#define ST_CONTEXT_FLAG_NO_ERROR (1 << 4) 89#define ST_CONTEXT_FLAG_RELEASE_NONE (1 << 5) 90#define ST_CONTEXT_FLAG_HIGH_PRIORITY (1 << 6) 91#define ST_CONTEXT_FLAG_LOW_PRIORITY (1 << 7) 92 93/** 94 * Reasons that context creation might fail. 95 */ 96enum st_context_error { 97 ST_CONTEXT_SUCCESS = 0, 98 ST_CONTEXT_ERROR_NO_MEMORY, 99 ST_CONTEXT_ERROR_BAD_API, 100 ST_CONTEXT_ERROR_BAD_VERSION, 101 ST_CONTEXT_ERROR_BAD_FLAG, 102 ST_CONTEXT_ERROR_UNKNOWN_ATTRIBUTE, 103 ST_CONTEXT_ERROR_UNKNOWN_FLAG 104}; 105 106/** 107 * Used in st_context_iface->teximage. 108 */ 109enum st_texture_type { 110 ST_TEXTURE_1D, 111 ST_TEXTURE_2D, 112 ST_TEXTURE_3D, 113 ST_TEXTURE_RECT 114}; 115 116/** 117 * Available attachments of framebuffer. 118 */ 119enum st_attachment_type { 120 ST_ATTACHMENT_FRONT_LEFT, 121 ST_ATTACHMENT_BACK_LEFT, 122 ST_ATTACHMENT_FRONT_RIGHT, 123 ST_ATTACHMENT_BACK_RIGHT, 124 ST_ATTACHMENT_DEPTH_STENCIL, 125 ST_ATTACHMENT_ACCUM, 126 127 ST_ATTACHMENT_COUNT, 128 ST_ATTACHMENT_INVALID = -1 129}; 130 131/* for buffer_mask in st_visual */ 132#define ST_ATTACHMENT_FRONT_LEFT_MASK (1 << ST_ATTACHMENT_FRONT_LEFT) 133#define ST_ATTACHMENT_BACK_LEFT_MASK (1 << ST_ATTACHMENT_BACK_LEFT) 134#define ST_ATTACHMENT_FRONT_RIGHT_MASK (1 << ST_ATTACHMENT_FRONT_RIGHT) 135#define ST_ATTACHMENT_BACK_RIGHT_MASK (1 << ST_ATTACHMENT_BACK_RIGHT) 136#define ST_ATTACHMENT_DEPTH_STENCIL_MASK (1 << ST_ATTACHMENT_DEPTH_STENCIL) 137#define ST_ATTACHMENT_ACCUM_MASK (1 << ST_ATTACHMENT_ACCUM) 138 139/** 140 * Flush flags. 141 */ 142#define ST_FLUSH_FRONT (1 << 0) 143#define ST_FLUSH_END_OF_FRAME (1 << 1) 144#define ST_FLUSH_WAIT (1 << 2) 145#define ST_FLUSH_FENCE_FD (1 << 3) 146 147/** 148 * State invalidation flags to notify frontends that states have been changed 149 * behind their back. 150 */ 151#define ST_INVALIDATE_FS_SAMPLER_VIEWS (1 << 0) 152#define ST_INVALIDATE_FS_CONSTBUF0 (1 << 1) 153#define ST_INVALIDATE_VS_CONSTBUF0 (1 << 2) 154#define ST_INVALIDATE_VERTEX_BUFFERS (1 << 3) 155 156/** 157 * Value to st_manager->get_param function. 158 */ 159enum st_manager_param { 160 /** 161 * The DRI frontend on old libGL's doesn't do the right thing 162 * with regards to invalidating the framebuffers. 163 * 164 * For the GL gallium frontend that means that it needs to invalidate 165 * the framebuffer in glViewport itself. 166 */ 167 ST_MANAGER_BROKEN_INVALIDATE 168}; 169 170struct pipe_context; 171struct pipe_resource; 172struct pipe_fence_handle; 173struct util_queue_monitoring; 174 175/** 176 * Used in st_manager_iface->get_egl_image. 177 */ 178struct st_egl_image 179{ 180 /* this is owned by the caller */ 181 struct pipe_resource *texture; 182 183 /* format only differs from texture->format for multi-planar (YUV): */ 184 enum pipe_format format; 185 186 unsigned level; 187 unsigned layer; 188 /* GL internal format. */ 189 unsigned internalformat; 190}; 191 192/** 193 * Represent the visual of a framebuffer. 194 */ 195struct st_visual 196{ 197 /** 198 * Available buffers. Bitfield of ST_ATTACHMENT_*_MASK bits. 199 */ 200 unsigned buffer_mask; 201 202 /** 203 * Buffer formats. The formats are always set even when the buffer is 204 * not available. 205 */ 206 enum pipe_format color_format; 207 enum pipe_format depth_stencil_format; 208 enum pipe_format accum_format; 209 unsigned samples; 210}; 211 212 213/** 214 * Configuration options from driconf 215 */ 216struct st_config_options 217{ 218 bool disable_blend_func_extended; 219 bool disable_glsl_line_continuations; 220 bool disable_arb_gpu_shader5; 221 bool force_glsl_extensions_warn; 222 unsigned force_glsl_version; 223 bool allow_extra_pp_tokens; 224 bool allow_glsl_extension_directive_midshader; 225 bool allow_glsl_120_subset_in_110; 226 bool allow_glsl_builtin_const_expression; 227 bool allow_glsl_relaxed_es; 228 bool allow_glsl_builtin_variable_redeclaration; 229 bool allow_higher_compat_version; 230 bool glsl_ignore_write_to_readonly_var; 231 bool glsl_zero_init; 232 bool vs_position_always_invariant; 233 bool vs_position_always_precise; 234 bool force_glsl_abs_sqrt; 235 bool allow_glsl_cross_stage_interpolation_mismatch; 236 bool allow_draw_out_of_order; 237 bool ignore_map_unsynchronized; 238 bool force_integer_tex_nearest; 239 bool force_gl_names_reuse; 240 bool transcode_etc; 241 bool transcode_astc; 242 char *force_gl_vendor; 243 char *force_gl_renderer; 244 unsigned char config_options_sha1[20]; 245}; 246 247/** 248 * Represent the attributes of a context. 249 */ 250struct st_context_attribs 251{ 252 /** 253 * The profile and minimal version to support. 254 * 255 * The valid profiles and versions are rendering API dependent. The latest 256 * version satisfying the request should be returned. 257 */ 258 enum st_profile_type profile; 259 int major, minor; 260 261 /** Mask of ST_CONTEXT_FLAG_x bits */ 262 unsigned flags; 263 264 /** 265 * The visual of the framebuffers the context will be bound to. 266 */ 267 struct st_visual visual; 268 269 /** 270 * Configuration options. 271 */ 272 struct st_config_options options; 273}; 274 275struct st_context_iface; 276struct st_manager; 277 278/** 279 * Represent a windowing system drawable. 280 * 281 * The framebuffer is implemented by the frontend manager and 282 * used by gallium frontends. 283 * 284 * Instead of the winsys poking into the frontend context to figure 285 * out what buffers that might be needed in the future by the frontend 286 * context, it calls into the framebuffer to get the textures. 287 * 288 * This structure along with the notify_invalid_framebuffer 289 * allows framebuffers to be shared between different threads 290 * but at the same make the API context free from thread 291 * synchronization primitves, with the exception of a small 292 * atomic flag used for notification of framebuffer dirty status. 293 * 294 * The thread synchronization is put inside the framebuffer 295 * and only called once the framebuffer has become dirty. 296 */ 297struct st_framebuffer_iface 298{ 299 /** 300 * Atomic stamp which changes when framebuffers need to be updated. 301 */ 302 int32_t stamp; 303 304 /** 305 * Identifier that uniquely identifies the framebuffer interface object. 306 */ 307 uint32_t ID; 308 309 /** 310 * The frontend manager that manages this object. 311 */ 312 struct st_manager *state_manager; 313 314 /** 315 * Available for the frontend manager to use. 316 */ 317 void *st_manager_private; 318 319 /** 320 * The visual of a framebuffer. 321 */ 322 const struct st_visual *visual; 323 324 /** 325 * Flush the front buffer. 326 * 327 * On some window systems, changes to the front buffers are not immediately 328 * visible. They need to be flushed. 329 * 330 * @att is one of the front buffer attachments. 331 */ 332 bool (*flush_front)(struct st_context_iface *stctx, 333 struct st_framebuffer_iface *stfbi, 334 enum st_attachment_type statt); 335 336 /** 337 * the gallium frontend asks for the textures it needs. 338 * 339 * It should try to only ask for attachments that it currently renders 340 * to, thus allowing the winsys to delay the allocation of textures not 341 * needed. For example front buffer attachments are not needed if you 342 * only do back buffer rendering. 343 * 344 * The implementor of this function needs to also ensure 345 * thread safty as this call might be done from multiple threads. 346 * 347 * The returned textures are owned by the caller. They should be 348 * unreferenced when no longer used. If this function is called multiple 349 * times with different sets of attachments, those buffers not included in 350 * the last call might be destroyed. This behavior might change in the 351 * future. 352 */ 353 bool (*validate)(struct st_context_iface *stctx, 354 struct st_framebuffer_iface *stfbi, 355 const enum st_attachment_type *statts, 356 unsigned count, 357 struct pipe_resource **out); 358 bool (*flush_swapbuffers) (struct st_context_iface *stctx, 359 struct st_framebuffer_iface *stfbi); 360}; 361 362/** 363 * Represent a rendering context. 364 * 365 * This entity is created from st_api and used by the frontend manager. 366 */ 367struct st_context_iface 368{ 369 /** 370 * Available for the gallium frontend and the manager to use. 371 */ 372 void *st_context_private; 373 void *st_manager_private; 374 375 /** 376 * The frontend manager that manages this object. 377 */ 378 struct st_manager *state_manager; 379 380 /** 381 * The CSO context associated with this context in case we need to draw 382 * something before swap buffers. 383 */ 384 struct cso_context *cso_context; 385 386 /** 387 * The gallium context. 388 */ 389 struct pipe_context *pipe; 390 391 /** 392 * Destroy the context. 393 */ 394 void (*destroy)(struct st_context_iface *stctxi); 395 396 /** 397 * Flush all drawing from context to the pipe also flushes the pipe. 398 */ 399 void (*flush)(struct st_context_iface *stctxi, unsigned flags, 400 struct pipe_fence_handle **fence, 401 void (*notify_before_flush_cb) (void*), 402 void* notify_before_flush_cb_args); 403 404 /** 405 * Replace the texture image of a texture object at the specified level. 406 * 407 * This function is optional. 408 */ 409 bool (*teximage)(struct st_context_iface *stctxi, 410 enum st_texture_type target, 411 int level, enum pipe_format internal_format, 412 struct pipe_resource *tex, bool mipmap); 413 414 /** 415 * Used to implement glXCopyContext. 416 */ 417 void (*copy)(struct st_context_iface *stctxi, 418 struct st_context_iface *stsrci, unsigned mask); 419 420 /** 421 * Used to implement wglShareLists. 422 */ 423 bool (*share)(struct st_context_iface *stctxi, 424 struct st_context_iface *stsrci); 425 426 /** 427 * Start the thread if the API has a worker thread. 428 * Called after the context has been created and fully initialized on both 429 * sides (e.g. st/mesa and st/dri). 430 */ 431 void (*start_thread)(struct st_context_iface *stctxi); 432 433 /** 434 * If the API is multithreaded, wait for all queued commands to complete. 435 * Called from the main thread. 436 */ 437 void (*thread_finish)(struct st_context_iface *stctxi); 438 439 /** 440 * Invalidate states to notify the frontend that states have been changed 441 * behind its back. 442 */ 443 void (*invalidate_state)(struct st_context_iface *stctxi, unsigned flags); 444}; 445 446 447/** 448 * Represent a frontend manager. 449 * 450 * This interface is implemented by the frontend manager. It corresponds 451 * to a "display" in the window system. 452 */ 453struct st_manager 454{ 455 struct pipe_screen *screen; 456 457 /** 458 * Look up and return the info of an EGLImage. 459 * 460 * This is used to implement for example EGLImageTargetTexture2DOES. 461 * The GLeglImageOES agrument of that call is passed directly to this 462 * function call and the information needed to access this is returned 463 * in the given struct out. 464 * 465 * @smapi: manager owning the caller context 466 * @stctx: caller context 467 * @egl_image: EGLImage that caller recived 468 * @out: return struct filled out with access information. 469 * 470 * This function is optional. 471 */ 472 bool (*get_egl_image)(struct st_manager *smapi, 473 void *egl_image, 474 struct st_egl_image *out); 475 476 /** 477 * Validate EGLImage passed to get_egl_image. 478 */ 479 bool (*validate_egl_image)(struct st_manager *smapi, 480 void *egl_image); 481 482 /** 483 * Query an manager param. 484 */ 485 int (*get_param)(struct st_manager *smapi, 486 enum st_manager_param param); 487 488 /** 489 * Call the loader function setBackgroundContext. Called from the worker 490 * thread. 491 */ 492 void (*set_background_context)(struct st_context_iface *stctxi, 493 struct util_queue_monitoring *queue_info); 494 495 /** 496 * Destroy any private data used by the frontend manager. 497 */ 498 void (*destroy)(struct st_manager *smapi); 499 500 /** 501 * Available for the frontend manager to use. 502 */ 503 void *st_manager_private; 504}; 505 506/** 507 * Represent a rendering API such as OpenGL or OpenVG. 508 * 509 * Implemented by the gallium frontend and used by the frontend manager. 510 */ 511struct st_api 512{ 513 /** 514 * The name of the rendering API. This is informative. 515 */ 516 const char *name; 517 518 /** 519 * The supported rendering API. 520 */ 521 enum st_api_type api; 522 523 /** 524 * The supported profiles. Tested with ST_PROFILE_*_MASK. 525 */ 526 unsigned profile_mask; 527 528 /** 529 * The supported optional features. Tested with ST_FEATURE_*_MASK. 530 */ 531 unsigned feature_mask; 532 533 /** 534 * Destroy the API. 535 */ 536 void (*destroy)(struct st_api *stapi); 537 538 /** 539 * Query supported OpenGL versions. (if applicable) 540 * The format is (major*10+minor). 541 */ 542 void (*query_versions)(struct st_api *stapi, struct st_manager *sm, 543 struct st_config_options *options, 544 int *gl_core_version, 545 int *gl_compat_version, 546 int *gl_es1_version, 547 int *gl_es2_version); 548 549 /** 550 * Create a rendering context. 551 */ 552 struct st_context_iface *(*create_context)(struct st_api *stapi, 553 struct st_manager *smapi, 554 const struct st_context_attribs *attribs, 555 enum st_context_error *error, 556 struct st_context_iface *stsharei); 557 558 /** 559 * Bind the context to the calling thread with draw and read as drawables. 560 * 561 * The framebuffers might be NULL, or might have different visuals than the 562 * context does. 563 */ 564 bool (*make_current)(struct st_api *stapi, 565 struct st_context_iface *stctxi, 566 struct st_framebuffer_iface *stdrawi, 567 struct st_framebuffer_iface *streadi); 568 569 /** 570 * Get the currently bound context in the calling thread. 571 */ 572 struct st_context_iface *(*get_current)(struct st_api *stapi); 573 574 /** 575 * Notify the st manager the framebuffer interface object 576 * is no longer valid. 577 */ 578 void (*destroy_drawable)(struct st_api *stapi, 579 struct st_framebuffer_iface *stfbi); 580}; 581 582/** 583 * Return true if the visual has the specified buffers. 584 */ 585static inline bool 586st_visual_have_buffers(const struct st_visual *visual, unsigned mask) 587{ 588 return ((visual->buffer_mask & mask) == mask); 589} 590 591#endif /* _API_H_ */ 592