meta.h revision af69d88d
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 2009 VMware, Inc. 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 "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26#ifndef META_H 27#define META_H 28 29#include "main/mtypes.h" 30 31/** 32 * \name Flags for meta operations 33 * \{ 34 * 35 * These flags are passed to _mesa_meta_begin(). 36 */ 37#define MESA_META_ALL ~0x0 38#define MESA_META_ALPHA_TEST 0x1 39#define MESA_META_BLEND 0x2 /**< includes logicop */ 40#define MESA_META_COLOR_MASK 0x4 41#define MESA_META_DEPTH_TEST 0x8 42#define MESA_META_FOG 0x10 43#define MESA_META_PIXEL_STORE 0x20 44#define MESA_META_PIXEL_TRANSFER 0x40 45#define MESA_META_RASTERIZATION 0x80 46#define MESA_META_SCISSOR 0x100 47#define MESA_META_SHADER 0x200 48#define MESA_META_STENCIL_TEST 0x400 49#define MESA_META_TRANSFORM 0x800 /**< modelview/projection matrix state */ 50#define MESA_META_TEXTURE 0x1000 51#define MESA_META_VERTEX 0x2000 52#define MESA_META_VIEWPORT 0x4000 53#define MESA_META_CLAMP_FRAGMENT_COLOR 0x8000 54#define MESA_META_CLAMP_VERTEX_COLOR 0x10000 55#define MESA_META_CONDITIONAL_RENDER 0x20000 56#define MESA_META_CLIP 0x40000 57#define MESA_META_SELECT_FEEDBACK 0x80000 58#define MESA_META_MULTISAMPLE 0x100000 59#define MESA_META_FRAMEBUFFER_SRGB 0x200000 60#define MESA_META_OCCLUSION_QUERY 0x400000 61#define MESA_META_DRAW_BUFFERS 0x800000 62#define MESA_META_DITHER 0x1000000 63/**\}*/ 64 65/** 66 * State which we may save/restore across meta ops. 67 * XXX this may be incomplete... 68 */ 69struct save_state 70{ 71 GLbitfield SavedState; /**< bitmask of MESA_META_* flags */ 72 73 /* Always saved/restored with meta. */ 74 gl_api API; 75 76 /** MESA_META_CLEAR (and others?) */ 77 struct gl_query_object *CurrentOcclusionObject; 78 79 /** MESA_META_ALPHA_TEST */ 80 GLboolean AlphaEnabled; 81 GLenum AlphaFunc; 82 GLclampf AlphaRef; 83 84 /** MESA_META_BLEND */ 85 GLbitfield BlendEnabled; 86 GLboolean ColorLogicOpEnabled; 87 88 /** MESA_META_DITHER */ 89 GLboolean DitherFlag; 90 91 /** MESA_META_COLOR_MASK */ 92 GLubyte ColorMask[MAX_DRAW_BUFFERS][4]; 93 94 /** MESA_META_DEPTH_TEST */ 95 struct gl_depthbuffer_attrib Depth; 96 97 /** MESA_META_FOG */ 98 GLboolean Fog; 99 100 /** MESA_META_PIXEL_STORE */ 101 struct gl_pixelstore_attrib Pack, Unpack; 102 103 /** MESA_META_PIXEL_TRANSFER */ 104 GLfloat RedBias, RedScale; 105 GLfloat GreenBias, GreenScale; 106 GLfloat BlueBias, BlueScale; 107 GLfloat AlphaBias, AlphaScale; 108 GLfloat DepthBias, DepthScale; 109 GLboolean MapColorFlag; 110 111 /** MESA_META_RASTERIZATION */ 112 GLenum FrontPolygonMode, BackPolygonMode; 113 GLboolean PolygonOffset; 114 GLboolean PolygonSmooth; 115 GLboolean PolygonStipple; 116 GLboolean PolygonCull; 117 118 /** MESA_META_SCISSOR */ 119 struct gl_scissor_attrib Scissor; 120 121 /** MESA_META_SHADER */ 122 GLboolean VertexProgramEnabled; 123 struct gl_vertex_program *VertexProgram; 124 GLboolean FragmentProgramEnabled; 125 struct gl_fragment_program *FragmentProgram; 126 GLboolean ATIFragmentShaderEnabled; 127 struct gl_shader_program *Shader[MESA_SHADER_STAGES]; 128 struct gl_shader_program *ActiveShader; 129 struct gl_pipeline_object *Pipeline; 130 131 /** MESA_META_STENCIL_TEST */ 132 struct gl_stencil_attrib Stencil; 133 134 /** MESA_META_TRANSFORM */ 135 GLenum MatrixMode; 136 GLfloat ModelviewMatrix[16]; 137 GLfloat ProjectionMatrix[16]; 138 GLfloat TextureMatrix[16]; 139 140 /** MESA_META_CLIP */ 141 GLbitfield ClipPlanesEnabled; 142 143 /** MESA_META_TEXTURE */ 144 GLuint ActiveUnit; 145 GLuint ClientActiveUnit; 146 /** for unit[0] only */ 147 struct gl_texture_object *CurrentTexture[NUM_TEXTURE_TARGETS]; 148 /** mask of TEXTURE_2D_BIT, etc */ 149 GLbitfield TexEnabled[MAX_TEXTURE_UNITS]; 150 GLbitfield TexGenEnabled[MAX_TEXTURE_UNITS]; 151 GLuint EnvMode; /* unit[0] only */ 152 153 /** MESA_META_VERTEX */ 154 struct gl_vertex_array_object *VAO; 155 struct gl_buffer_object *ArrayBufferObj; 156 157 /** MESA_META_VIEWPORT */ 158 GLfloat ViewportX, ViewportY, ViewportW, ViewportH; 159 GLclampd DepthNear, DepthFar; 160 161 /** MESA_META_CLAMP_FRAGMENT_COLOR */ 162 GLenum ClampFragmentColor; 163 164 /** MESA_META_CLAMP_VERTEX_COLOR */ 165 GLenum ClampVertexColor; 166 167 /** MESA_META_CONDITIONAL_RENDER */ 168 struct gl_query_object *CondRenderQuery; 169 GLenum CondRenderMode; 170 171 /** MESA_META_SELECT_FEEDBACK */ 172 GLenum RenderMode; 173 struct gl_selection Select; 174 struct gl_feedback Feedback; 175 176 /** MESA_META_MULTISAMPLE */ 177 struct gl_multisample_attrib Multisample; 178 179 /** MESA_META_FRAMEBUFFER_SRGB */ 180 GLboolean sRGBEnabled; 181 182 /** Miscellaneous (always disabled) */ 183 GLboolean Lighting; 184 GLboolean RasterDiscard; 185 GLboolean TransformFeedbackNeedsResume; 186 187 GLuint DrawBufferName, ReadBufferName, RenderbufferName; 188 189 /** MESA_META_DRAW_BUFFERS */ 190 GLenum ColorDrawBuffers[MAX_DRAW_BUFFERS]; 191}; 192 193/** 194 * Temporary texture used for glBlitFramebuffer, glDrawPixels, etc. 195 * This is currently shared by all the meta ops. But we could create a 196 * separate one for each of glDrawPixel, glBlitFramebuffer, glCopyPixels, etc. 197 */ 198struct temp_texture 199{ 200 GLuint TexObj; 201 GLenum Target; /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */ 202 GLsizei MinSize; /**< Min texture size to allocate */ 203 GLsizei MaxSize; /**< Max possible texture size */ 204 GLboolean NPOT; /**< Non-power of two size OK? */ 205 GLsizei Width, Height; /**< Current texture size */ 206 GLenum IntFormat; 207 GLfloat Sright, Ttop; /**< right, top texcoords */ 208}; 209 210/** 211 * State for GLSL texture sampler which is used to generate fragment 212 * shader in _mesa_meta_generate_mipmap(). 213 */ 214struct blit_shader { 215 const char *type; 216 const char *func; 217 const char *texcoords; 218 GLuint shader_prog; 219}; 220 221/** 222 * Table of all sampler types and shaders for accessing them. 223 */ 224struct blit_shader_table { 225 struct blit_shader sampler_1d; 226 struct blit_shader sampler_2d; 227 struct blit_shader sampler_3d; 228 struct blit_shader sampler_rect; 229 struct blit_shader sampler_cubemap; 230 struct blit_shader sampler_1d_array; 231 struct blit_shader sampler_2d_array; 232 struct blit_shader sampler_cubemap_array; 233}; 234 235/** 236 * Indices in the blit_state->msaa_shaders[] array 237 * 238 * Note that setup_glsl_msaa_blit_shader() assumes that the _INT enums are one 239 * more than the non-_INT version and _UINT is one beyond that. 240 */ 241enum blit_msaa_shader { 242 BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 243 BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 244 BLIT_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 245 BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY, 246 BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY_INT, 247 BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY_UINT, 248 BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE, 249 BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY, 250 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 251 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 252 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 253 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY, 254 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_INT, 255 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_UINT, 256 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_RESOLVE, 257 BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY, 258 BLIT_MSAA_SHADER_COUNT, 259}; 260 261/** 262 * State for glBlitFramebufer() 263 */ 264struct blit_state 265{ 266 GLuint VAO; 267 GLuint VBO; 268 struct blit_shader_table shaders; 269 GLuint msaa_shaders[BLIT_MSAA_SHADER_COUNT]; 270 struct temp_texture depthTex; 271 bool no_ctsi_fallback; 272}; 273 274struct fb_tex_blit_state 275{ 276 GLint baseLevelSave, maxLevelSave; 277 GLuint sampler, samplerSave, stencilSamplingSave; 278 GLuint tempTex; 279}; 280 281 282/** 283 * State for glClear() 284 */ 285struct clear_state 286{ 287 GLuint VAO; 288 GLuint VBO; 289 GLuint ShaderProg; 290 GLint ColorLocation; 291 GLint LayerLocation; 292 293 GLuint IntegerShaderProg; 294 GLint IntegerColorLocation; 295 GLint IntegerLayerLocation; 296}; 297 298 299/** 300 * State for glCopyPixels() 301 */ 302struct copypix_state 303{ 304 GLuint VAO; 305 GLuint VBO; 306}; 307 308 309/** 310 * State for glDrawPixels() 311 */ 312struct drawpix_state 313{ 314 GLuint VAO; 315 GLuint VBO; 316 317 GLuint StencilFP; /**< Fragment program for drawing stencil images */ 318 GLuint DepthFP; /**< Fragment program for drawing depth images */ 319}; 320 321 322/** 323 * State for glBitmap() 324 */ 325struct bitmap_state 326{ 327 GLuint VAO; 328 GLuint VBO; 329 struct temp_texture Tex; /**< separate texture from other meta ops */ 330}; 331 332/** 333 * State for _mesa_meta_generate_mipmap() 334 */ 335struct gen_mipmap_state 336{ 337 GLuint VAO; 338 GLuint VBO; 339 GLuint FBO; 340 GLuint Sampler; 341 342 struct blit_shader_table shaders; 343}; 344 345/** 346 * One of the FBO states for decompress_state. There will be one for each 347 * required renderbuffer format. 348 */ 349struct decompress_fbo_state 350{ 351 GLuint FBO, RBO; 352 GLint Width, Height; 353}; 354 355/** 356 * State for texture decompression 357 */ 358struct decompress_state 359{ 360 GLuint VAO; 361 struct decompress_fbo_state byteFBO, floatFBO; 362 GLuint VBO, Sampler; 363 364 struct blit_shader_table shaders; 365}; 366 367/** 368 * State for glDrawTex() 369 */ 370struct drawtex_state 371{ 372 GLuint VAO; 373 GLuint VBO; 374}; 375 376#define MAX_META_OPS_DEPTH 8 377/** 378 * All per-context meta state. 379 */ 380struct gl_meta_state 381{ 382 /** Stack of state saved during meta-ops */ 383 struct save_state Save[MAX_META_OPS_DEPTH]; 384 /** Save stack depth */ 385 GLuint SaveStackDepth; 386 387 struct temp_texture TempTex; 388 389 struct blit_state Blit; /**< For _mesa_meta_BlitFramebuffer() */ 390 struct clear_state Clear; /**< For _mesa_meta_Clear() */ 391 struct copypix_state CopyPix; /**< For _mesa_meta_CopyPixels() */ 392 struct drawpix_state DrawPix; /**< For _mesa_meta_DrawPixels() */ 393 struct bitmap_state Bitmap; /**< For _mesa_meta_Bitmap() */ 394 struct gen_mipmap_state Mipmap; /**< For _mesa_meta_GenerateMipmap() */ 395 struct decompress_state Decompress; /**< For texture decompression */ 396 struct drawtex_state DrawTex; /**< For _mesa_meta_DrawTex() */ 397}; 398 399struct vertex { 400 GLfloat x, y, z, tex[4]; 401 GLfloat r, g, b, a; 402}; 403 404extern void 405_mesa_meta_init(struct gl_context *ctx); 406 407extern void 408_mesa_meta_free(struct gl_context *ctx); 409 410extern void 411_mesa_meta_begin(struct gl_context *ctx, GLbitfield state); 412 413extern void 414_mesa_meta_end(struct gl_context *ctx); 415 416extern GLboolean 417_mesa_meta_in_progress(struct gl_context *ctx); 418 419extern void 420_mesa_meta_fb_tex_blit_begin(const struct gl_context *ctx, 421 struct fb_tex_blit_state *blit); 422 423extern void 424_mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target, 425 struct fb_tex_blit_state *blit); 426 427extern GLboolean 428_mesa_meta_bind_rb_as_tex_image(struct gl_context *ctx, 429 struct gl_renderbuffer *rb, 430 GLuint *tex, 431 struct gl_texture_object **texObj, 432 GLenum *target); 433 434GLuint 435_mesa_meta_setup_sampler(struct gl_context *ctx, 436 const struct gl_texture_object *texObj, 437 GLenum target, GLenum filter, GLuint srcLevel); 438 439extern GLbitfield 440_mesa_meta_BlitFramebuffer(struct gl_context *ctx, 441 GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 442 GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 443 GLbitfield mask, GLenum filter); 444 445extern void 446_mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx, 447 GLint srcX0, GLint srcY0, 448 GLint srcX1, GLint srcY1, 449 GLint dstX0, GLint dstY0, 450 GLint dstX1, GLint dstY1, 451 GLbitfield mask, GLenum filter); 452 453bool 454_mesa_meta_CopyImageSubData_uncompressed(struct gl_context *ctx, 455 struct gl_texture_image *src_tex_image, 456 int src_x, int src_y, int src_z, 457 struct gl_texture_image *dst_tex_image, 458 int dst_x, int dst_y, int dst_z, 459 int src_width, int src_height); 460 461extern void 462_mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers); 463 464extern void 465_mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers); 466 467extern void 468_mesa_meta_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, 469 GLsizei width, GLsizei height, 470 GLint dstx, GLint dsty, GLenum type); 471 472extern void 473_mesa_meta_DrawPixels(struct gl_context *ctx, 474 GLint x, GLint y, GLsizei width, GLsizei height, 475 GLenum format, GLenum type, 476 const struct gl_pixelstore_attrib *unpack, 477 const GLvoid *pixels); 478 479extern void 480_mesa_meta_Bitmap(struct gl_context *ctx, 481 GLint x, GLint y, GLsizei width, GLsizei height, 482 const struct gl_pixelstore_attrib *unpack, 483 const GLubyte *bitmap); 484 485extern void 486_mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, 487 struct gl_texture_object *texObj); 488 489extern void 490_mesa_meta_CopyTexSubImage(struct gl_context *ctx, GLuint dims, 491 struct gl_texture_image *texImage, 492 GLint xoffset, GLint yoffset, GLint slice, 493 struct gl_renderbuffer *rb, 494 GLint x, GLint y, 495 GLsizei width, GLsizei height); 496 497extern void 498_mesa_meta_ClearTexSubImage(struct gl_context *ctx, 499 struct gl_texture_image *texImage, 500 GLint xoffset, GLint yoffset, GLint zoffset, 501 GLsizei width, GLsizei height, GLsizei depth, 502 const GLvoid *clearValue); 503 504extern void 505_mesa_meta_GetTexImage(struct gl_context *ctx, 506 GLenum format, GLenum type, GLvoid *pixels, 507 struct gl_texture_image *texImage); 508 509extern void 510_mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, 511 GLfloat width, GLfloat height); 512 513/* meta-internal functions */ 514void 515_mesa_meta_drawbuffers_from_bitfield(GLbitfield bits); 516 517GLuint 518_mesa_meta_compile_shader_with_debug(struct gl_context *ctx, GLenum target, 519 const GLcharARB *source); 520 521 522GLuint 523_mesa_meta_link_program_with_debug(struct gl_context *ctx, GLuint program); 524 525void 526_mesa_meta_compile_and_link_program(struct gl_context *ctx, 527 const char *vs_source, 528 const char *fs_source, 529 const char *name, 530 GLuint *program); 531 532GLboolean 533_mesa_meta_alloc_texture(struct temp_texture *tex, 534 GLsizei width, GLsizei height, GLenum intFormat); 535 536void 537_mesa_meta_setup_texture_coords(GLenum faceTarget, 538 GLint slice, 539 GLint width, 540 GLint height, 541 GLint depth, 542 GLfloat coords0[4], 543 GLfloat coords1[4], 544 GLfloat coords2[4], 545 GLfloat coords3[4]); 546 547struct temp_texture * 548_mesa_meta_get_temp_texture(struct gl_context *ctx); 549 550struct temp_texture * 551_mesa_meta_get_temp_depth_texture(struct gl_context *ctx); 552 553void 554_mesa_meta_setup_vertex_objects(GLuint *VAO, GLuint *VBO, 555 bool use_generic_attributes, 556 unsigned vertex_size, unsigned texcoord_size, 557 unsigned color_size); 558 559void 560_mesa_meta_setup_ff_tnl_for_blit(GLuint *VAO, GLuint *VBO, 561 unsigned texcoord_size); 562 563void 564_mesa_meta_setup_drawpix_texture(struct gl_context *ctx, 565 struct temp_texture *tex, 566 GLboolean newTex, 567 GLsizei width, GLsizei height, 568 GLenum format, GLenum type, 569 const GLvoid *pixels); 570 571void 572_mesa_meta_setup_copypix_texture(struct gl_context *ctx, 573 struct temp_texture *tex, 574 GLint srcX, GLint srcY, 575 GLsizei width, GLsizei height, 576 GLenum intFormat, 577 GLenum filter); 578 579void 580_mesa_meta_setup_blit_shader(struct gl_context *ctx, 581 GLenum target, 582 struct blit_shader_table *table); 583 584void 585_mesa_meta_glsl_blit_cleanup(struct blit_state *blit); 586 587void 588_mesa_meta_blit_shader_table_cleanup(struct blit_shader_table *table); 589 590void 591_mesa_meta_glsl_generate_mipmap_cleanup(struct gen_mipmap_state *mipmap); 592 593void 594_mesa_meta_bind_fbo_image(GLenum target, GLenum attachment, 595 struct gl_texture_image *texImage, GLuint layer); 596 597#endif /* META_H */ 598