1848b8605Smrg/* 2848b8605Smrg * Mesa 3-D graphics library 3848b8605Smrg * 4848b8605Smrg * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 5848b8605Smrg * 6848b8605Smrg * Permission is hereby granted, free of charge, to any person obtaining a 7848b8605Smrg * copy of this software and associated documentation files (the "Software"), 8848b8605Smrg * to deal in the Software without restriction, including without limitation 9848b8605Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10848b8605Smrg * and/or sell copies of the Software, and to permit persons to whom the 11848b8605Smrg * Software is furnished to do so, subject to the following conditions: 12848b8605Smrg * 13848b8605Smrg * The above copyright notice and this permission notice shall be included 14848b8605Smrg * in all copies or substantial portions of the Software. 15848b8605Smrg * 16848b8605Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17848b8605Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18848b8605Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19848b8605Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20848b8605Smrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21848b8605Smrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22848b8605Smrg * OTHER DEALINGS IN THE SOFTWARE. 23848b8605Smrg */ 24848b8605Smrg 25848b8605Smrg 26848b8605Smrg#ifndef META_H 27848b8605Smrg#define META_H 28848b8605Smrg 29848b8605Smrg#include "main/mtypes.h" 30848b8605Smrg 31848b8605Smrg/** 32848b8605Smrg * \name Flags for meta operations 33848b8605Smrg * \{ 34848b8605Smrg * 35848b8605Smrg * These flags are passed to _mesa_meta_begin(). 36848b8605Smrg */ 37848b8605Smrg#define MESA_META_ALL ~0x0 38848b8605Smrg#define MESA_META_ALPHA_TEST 0x1 39848b8605Smrg#define MESA_META_BLEND 0x2 /**< includes logicop */ 40848b8605Smrg#define MESA_META_COLOR_MASK 0x4 41848b8605Smrg#define MESA_META_DEPTH_TEST 0x8 42848b8605Smrg#define MESA_META_FOG 0x10 43848b8605Smrg#define MESA_META_PIXEL_STORE 0x20 44848b8605Smrg#define MESA_META_PIXEL_TRANSFER 0x40 45848b8605Smrg#define MESA_META_RASTERIZATION 0x80 46848b8605Smrg#define MESA_META_SCISSOR 0x100 47848b8605Smrg#define MESA_META_SHADER 0x200 48848b8605Smrg#define MESA_META_STENCIL_TEST 0x400 49848b8605Smrg#define MESA_META_TRANSFORM 0x800 /**< modelview/projection matrix state */ 50848b8605Smrg#define MESA_META_TEXTURE 0x1000 51848b8605Smrg#define MESA_META_VERTEX 0x2000 52848b8605Smrg#define MESA_META_VIEWPORT 0x4000 53848b8605Smrg#define MESA_META_CLAMP_FRAGMENT_COLOR 0x8000 54848b8605Smrg#define MESA_META_CLAMP_VERTEX_COLOR 0x10000 55848b8605Smrg#define MESA_META_CONDITIONAL_RENDER 0x20000 56848b8605Smrg#define MESA_META_CLIP 0x40000 57848b8605Smrg#define MESA_META_SELECT_FEEDBACK 0x80000 58848b8605Smrg#define MESA_META_MULTISAMPLE 0x100000 59848b8605Smrg#define MESA_META_FRAMEBUFFER_SRGB 0x200000 60848b8605Smrg#define MESA_META_OCCLUSION_QUERY 0x400000 61848b8605Smrg#define MESA_META_DRAW_BUFFERS 0x800000 62848b8605Smrg#define MESA_META_DITHER 0x1000000 63848b8605Smrg/**\}*/ 64848b8605Smrg 65848b8605Smrg/** 66848b8605Smrg * State which we may save/restore across meta ops. 67848b8605Smrg * XXX this may be incomplete... 68848b8605Smrg */ 69848b8605Smrgstruct save_state 70848b8605Smrg{ 71848b8605Smrg GLbitfield SavedState; /**< bitmask of MESA_META_* flags */ 72848b8605Smrg 73848b8605Smrg /* Always saved/restored with meta. */ 74848b8605Smrg gl_api API; 75b8e80941Smrg uint8_t ExtensionsVersion; 76848b8605Smrg 77848b8605Smrg /** MESA_META_CLEAR (and others?) */ 78848b8605Smrg struct gl_query_object *CurrentOcclusionObject; 79848b8605Smrg 80848b8605Smrg /** MESA_META_ALPHA_TEST */ 81848b8605Smrg GLboolean AlphaEnabled; 82848b8605Smrg GLenum AlphaFunc; 83848b8605Smrg GLclampf AlphaRef; 84848b8605Smrg 85848b8605Smrg /** MESA_META_BLEND */ 86848b8605Smrg GLbitfield BlendEnabled; 87848b8605Smrg GLboolean ColorLogicOpEnabled; 88848b8605Smrg 89848b8605Smrg /** MESA_META_DITHER */ 90848b8605Smrg GLboolean DitherFlag; 91848b8605Smrg 92848b8605Smrg /** MESA_META_COLOR_MASK */ 93b8e80941Smrg GLbitfield ColorMask; 94848b8605Smrg 95848b8605Smrg /** MESA_META_DEPTH_TEST */ 96848b8605Smrg struct gl_depthbuffer_attrib Depth; 97848b8605Smrg 98848b8605Smrg /** MESA_META_FOG */ 99848b8605Smrg GLboolean Fog; 100848b8605Smrg 101848b8605Smrg /** MESA_META_PIXEL_STORE */ 102848b8605Smrg struct gl_pixelstore_attrib Pack, Unpack; 103848b8605Smrg 104848b8605Smrg /** MESA_META_PIXEL_TRANSFER */ 105848b8605Smrg GLfloat RedBias, RedScale; 106848b8605Smrg GLfloat GreenBias, GreenScale; 107848b8605Smrg GLfloat BlueBias, BlueScale; 108848b8605Smrg GLfloat AlphaBias, AlphaScale; 109848b8605Smrg GLfloat DepthBias, DepthScale; 110848b8605Smrg GLboolean MapColorFlag; 111848b8605Smrg 112848b8605Smrg /** MESA_META_RASTERIZATION */ 113848b8605Smrg GLenum FrontPolygonMode, BackPolygonMode; 114848b8605Smrg GLboolean PolygonOffset; 115848b8605Smrg GLboolean PolygonSmooth; 116848b8605Smrg GLboolean PolygonStipple; 117848b8605Smrg GLboolean PolygonCull; 118848b8605Smrg 119848b8605Smrg /** MESA_META_SCISSOR */ 120848b8605Smrg struct gl_scissor_attrib Scissor; 121848b8605Smrg 122848b8605Smrg /** MESA_META_SHADER */ 123848b8605Smrg GLboolean VertexProgramEnabled; 124b8e80941Smrg struct gl_program *VertexProgram; 125848b8605Smrg GLboolean FragmentProgramEnabled; 126b8e80941Smrg struct gl_program *FragmentProgram; 127848b8605Smrg GLboolean ATIFragmentShaderEnabled; 128b8e80941Smrg struct gl_program *Program[MESA_SHADER_STAGES]; 129848b8605Smrg struct gl_shader_program *ActiveShader; 130848b8605Smrg struct gl_pipeline_object *Pipeline; 131848b8605Smrg 132848b8605Smrg /** MESA_META_STENCIL_TEST */ 133848b8605Smrg struct gl_stencil_attrib Stencil; 134848b8605Smrg 135848b8605Smrg /** MESA_META_TRANSFORM */ 136848b8605Smrg GLenum MatrixMode; 137848b8605Smrg GLfloat ModelviewMatrix[16]; 138848b8605Smrg GLfloat ProjectionMatrix[16]; 139848b8605Smrg GLfloat TextureMatrix[16]; 140b8e80941Smrg /** GL_ARB_clip_control */ 141b8e80941Smrg GLenum ClipOrigin; /**< GL_LOWER_LEFT or GL_UPPER_LEFT */ 142b8e80941Smrg GLenum ClipDepthMode; /**< GL_NEGATIVE_ONE_TO_ONE or GL_ZERO_TO_ONE */ 143848b8605Smrg 144848b8605Smrg /** MESA_META_CLIP */ 145848b8605Smrg GLbitfield ClipPlanesEnabled; 146848b8605Smrg 147848b8605Smrg /** MESA_META_TEXTURE */ 148848b8605Smrg GLuint ActiveUnit; 149848b8605Smrg /** for unit[0] only */ 150848b8605Smrg struct gl_texture_object *CurrentTexture[NUM_TEXTURE_TARGETS]; 151848b8605Smrg /** mask of TEXTURE_2D_BIT, etc */ 152848b8605Smrg GLbitfield TexEnabled[MAX_TEXTURE_UNITS]; 153848b8605Smrg GLbitfield TexGenEnabled[MAX_TEXTURE_UNITS]; 154848b8605Smrg GLuint EnvMode; /* unit[0] only */ 155848b8605Smrg 156848b8605Smrg /** MESA_META_VERTEX */ 157848b8605Smrg struct gl_vertex_array_object *VAO; 158848b8605Smrg 159848b8605Smrg /** MESA_META_VIEWPORT */ 160848b8605Smrg GLfloat ViewportX, ViewportY, ViewportW, ViewportH; 161b8e80941Smrg GLclampf DepthNear, DepthFar; 162848b8605Smrg 163848b8605Smrg /** MESA_META_CLAMP_FRAGMENT_COLOR */ 164848b8605Smrg GLenum ClampFragmentColor; 165848b8605Smrg 166848b8605Smrg /** MESA_META_CLAMP_VERTEX_COLOR */ 167848b8605Smrg GLenum ClampVertexColor; 168848b8605Smrg 169848b8605Smrg /** MESA_META_CONDITIONAL_RENDER */ 170848b8605Smrg struct gl_query_object *CondRenderQuery; 171848b8605Smrg GLenum CondRenderMode; 172848b8605Smrg 173848b8605Smrg /** MESA_META_SELECT_FEEDBACK */ 174848b8605Smrg GLenum RenderMode; 175848b8605Smrg struct gl_selection Select; 176848b8605Smrg struct gl_feedback Feedback; 177848b8605Smrg 178848b8605Smrg /** MESA_META_MULTISAMPLE */ 179848b8605Smrg struct gl_multisample_attrib Multisample; 180848b8605Smrg 181848b8605Smrg /** MESA_META_FRAMEBUFFER_SRGB */ 182848b8605Smrg GLboolean sRGBEnabled; 183848b8605Smrg 184848b8605Smrg /** Miscellaneous (always disabled) */ 185848b8605Smrg GLboolean Lighting; 186848b8605Smrg GLboolean RasterDiscard; 187848b8605Smrg GLboolean TransformFeedbackNeedsResume; 188848b8605Smrg 189b8e80941Smrg struct gl_framebuffer *DrawBuffer; 190b8e80941Smrg struct gl_framebuffer *ReadBuffer; 191848b8605Smrg 192848b8605Smrg /** MESA_META_DRAW_BUFFERS */ 193b8e80941Smrg GLenum16 ColorDrawBuffers[MAX_DRAW_BUFFERS]; 194848b8605Smrg}; 195848b8605Smrg 196848b8605Smrg/** 197848b8605Smrg * Temporary texture used for glBlitFramebuffer, glDrawPixels, etc. 198848b8605Smrg * This is currently shared by all the meta ops. But we could create a 199848b8605Smrg * separate one for each of glDrawPixel, glBlitFramebuffer, glCopyPixels, etc. 200848b8605Smrg */ 201848b8605Smrgstruct temp_texture 202848b8605Smrg{ 203b8e80941Smrg struct gl_texture_object *tex_obj; 204848b8605Smrg GLenum Target; /**< GL_TEXTURE_2D or GL_TEXTURE_RECTANGLE */ 205848b8605Smrg GLsizei MinSize; /**< Min texture size to allocate */ 206848b8605Smrg GLsizei MaxSize; /**< Max possible texture size */ 207848b8605Smrg GLboolean NPOT; /**< Non-power of two size OK? */ 208848b8605Smrg GLsizei Width, Height; /**< Current texture size */ 209848b8605Smrg GLenum IntFormat; 210848b8605Smrg GLfloat Sright, Ttop; /**< right, top texcoords */ 211848b8605Smrg}; 212848b8605Smrg 213848b8605Smrg/** 214848b8605Smrg * State for GLSL texture sampler which is used to generate fragment 215848b8605Smrg * shader in _mesa_meta_generate_mipmap(). 216848b8605Smrg */ 217848b8605Smrgstruct blit_shader { 218848b8605Smrg const char *type; 219848b8605Smrg const char *func; 220848b8605Smrg const char *texcoords; 221b8e80941Smrg struct gl_shader_program *shader_prog; 222848b8605Smrg}; 223848b8605Smrg 224848b8605Smrg/** 225848b8605Smrg * Table of all sampler types and shaders for accessing them. 226848b8605Smrg */ 227848b8605Smrgstruct blit_shader_table { 228848b8605Smrg struct blit_shader sampler_1d; 229848b8605Smrg struct blit_shader sampler_2d; 230848b8605Smrg struct blit_shader sampler_3d; 231848b8605Smrg struct blit_shader sampler_rect; 232848b8605Smrg struct blit_shader sampler_cubemap; 233848b8605Smrg struct blit_shader sampler_1d_array; 234848b8605Smrg struct blit_shader sampler_2d_array; 235848b8605Smrg struct blit_shader sampler_cubemap_array; 236848b8605Smrg}; 237848b8605Smrg 238848b8605Smrg/** 239848b8605Smrg * Indices in the blit_state->msaa_shaders[] array 240848b8605Smrg * 241b8e80941Smrg * Note that setup_glsl_msaa_blit_shader() assumes that the _INT enums are five 242b8e80941Smrg * more than the corresponding non-_INT versions and _UINT are five beyond that. 243848b8605Smrg */ 244848b8605Smrgenum blit_msaa_shader { 245b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 246b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 247b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 248b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 249b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE, 250b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 251b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 252b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 253b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 254b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_INT, 255b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 256b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 257b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 258b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 259b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_RESOLVE_UINT, 260848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY, 261848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY_INT, 262848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_COPY_UINT, 263848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_RESOLVE, 264848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_DEPTH_COPY, 265b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 266b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 267b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 268b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 269b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE, 270b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 271b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 272b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 273b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 274b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_INT, 275b8e80941Smrg BLIT_1X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 276b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 277b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 278b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 279b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_RESOLVE_UINT, 280848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY, 281848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_INT, 282848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_COPY_UINT, 283848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_RESOLVE, 284848b8605Smrg BLIT_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_DEPTH_COPY, 285b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE, 286b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE, 287b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE, 288b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_SCALED_RESOLVE, 289b8e80941Smrg BLIT_2X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_SCALED_RESOLVE, 290b8e80941Smrg BLIT_4X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_SCALED_RESOLVE, 291b8e80941Smrg BLIT_8X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_SCALED_RESOLVE, 292b8e80941Smrg BLIT_16X_MSAA_SHADER_2D_MULTISAMPLE_ARRAY_SCALED_RESOLVE, 293848b8605Smrg BLIT_MSAA_SHADER_COUNT, 294848b8605Smrg}; 295848b8605Smrg 296848b8605Smrg/** 297848b8605Smrg * State for glBlitFramebufer() 298848b8605Smrg */ 299848b8605Smrgstruct blit_state 300848b8605Smrg{ 301848b8605Smrg GLuint VAO; 302b8e80941Smrg struct gl_buffer_object *buf_obj; 303b8e80941Smrg struct blit_shader_table shaders_with_depth; 304b8e80941Smrg struct blit_shader_table shaders_without_depth; 305b8e80941Smrg struct gl_shader_program *msaa_shaders[BLIT_MSAA_SHADER_COUNT]; 306848b8605Smrg struct temp_texture depthTex; 307848b8605Smrg bool no_ctsi_fallback; 308848b8605Smrg}; 309848b8605Smrg 310848b8605Smrgstruct fb_tex_blit_state 311848b8605Smrg{ 312848b8605Smrg GLint baseLevelSave, maxLevelSave; 313b8e80941Smrg struct gl_sampler_object *samp_obj; 314b8e80941Smrg struct gl_sampler_object *samp_obj_save; 315b8e80941Smrg struct gl_texture_object *tex_obj; 316b8e80941Smrg struct gl_texture_object *temp_tex_obj; 317b8e80941Smrg GLuint stencilSamplingSave; 318848b8605Smrg}; 319848b8605Smrg 320848b8605Smrg 321848b8605Smrg/** 322848b8605Smrg * State for glClear() 323848b8605Smrg */ 324848b8605Smrgstruct clear_state 325848b8605Smrg{ 326848b8605Smrg GLuint VAO; 327b8e80941Smrg struct gl_buffer_object *buf_obj; 328b8e80941Smrg struct gl_shader_program *ShaderProg; 329b8e80941Smrg struct gl_shader_program *IntegerShaderProg; 330848b8605Smrg}; 331848b8605Smrg 332848b8605Smrg 333848b8605Smrg/** 334848b8605Smrg * State for glCopyPixels() 335848b8605Smrg */ 336848b8605Smrgstruct copypix_state 337848b8605Smrg{ 338848b8605Smrg GLuint VAO; 339b8e80941Smrg struct gl_buffer_object *buf_obj; 340848b8605Smrg}; 341848b8605Smrg 342848b8605Smrg 343848b8605Smrg/** 344848b8605Smrg * State for glDrawPixels() 345848b8605Smrg */ 346848b8605Smrgstruct drawpix_state 347848b8605Smrg{ 348848b8605Smrg GLuint VAO; 349b8e80941Smrg struct gl_buffer_object *buf_obj; 350848b8605Smrg 351848b8605Smrg GLuint StencilFP; /**< Fragment program for drawing stencil images */ 352848b8605Smrg GLuint DepthFP; /**< Fragment program for drawing depth images */ 353848b8605Smrg}; 354848b8605Smrg 355848b8605Smrg 356848b8605Smrg/** 357848b8605Smrg * State for glBitmap() 358848b8605Smrg */ 359848b8605Smrgstruct bitmap_state 360848b8605Smrg{ 361848b8605Smrg GLuint VAO; 362b8e80941Smrg struct gl_buffer_object *buf_obj; 363848b8605Smrg struct temp_texture Tex; /**< separate texture from other meta ops */ 364848b8605Smrg}; 365848b8605Smrg 366848b8605Smrg/** 367848b8605Smrg * State for _mesa_meta_generate_mipmap() 368848b8605Smrg */ 369848b8605Smrgstruct gen_mipmap_state 370848b8605Smrg{ 371848b8605Smrg GLuint VAO; 372b8e80941Smrg struct gl_buffer_object *buf_obj; 373b8e80941Smrg struct gl_framebuffer *fb; 374b8e80941Smrg struct gl_sampler_object *samp_obj; 375848b8605Smrg 376848b8605Smrg struct blit_shader_table shaders; 377848b8605Smrg}; 378848b8605Smrg 379848b8605Smrg/** 380848b8605Smrg * One of the FBO states for decompress_state. There will be one for each 381848b8605Smrg * required renderbuffer format. 382848b8605Smrg */ 383848b8605Smrgstruct decompress_fbo_state 384848b8605Smrg{ 385b8e80941Smrg struct gl_renderbuffer *rb; 386b8e80941Smrg struct gl_framebuffer *fb; 387848b8605Smrg GLint Width, Height; 388848b8605Smrg}; 389848b8605Smrg 390848b8605Smrg/** 391848b8605Smrg * State for texture decompression 392848b8605Smrg */ 393848b8605Smrgstruct decompress_state 394848b8605Smrg{ 395848b8605Smrg GLuint VAO; 396848b8605Smrg struct decompress_fbo_state byteFBO, floatFBO; 397b8e80941Smrg struct gl_buffer_object *buf_obj; 398b8e80941Smrg struct gl_sampler_object *samp_obj; 399848b8605Smrg 400848b8605Smrg struct blit_shader_table shaders; 401848b8605Smrg}; 402848b8605Smrg 403848b8605Smrg/** 404848b8605Smrg * State for glDrawTex() 405848b8605Smrg */ 406848b8605Smrgstruct drawtex_state 407848b8605Smrg{ 408848b8605Smrg GLuint VAO; 409b8e80941Smrg struct gl_buffer_object *buf_obj; 410848b8605Smrg}; 411848b8605Smrg 412848b8605Smrg#define MAX_META_OPS_DEPTH 8 413848b8605Smrg/** 414848b8605Smrg * All per-context meta state. 415848b8605Smrg */ 416848b8605Smrgstruct gl_meta_state 417848b8605Smrg{ 418848b8605Smrg /** Stack of state saved during meta-ops */ 419848b8605Smrg struct save_state Save[MAX_META_OPS_DEPTH]; 420848b8605Smrg /** Save stack depth */ 421848b8605Smrg GLuint SaveStackDepth; 422848b8605Smrg 423848b8605Smrg struct temp_texture TempTex; 424848b8605Smrg 425848b8605Smrg struct blit_state Blit; /**< For _mesa_meta_BlitFramebuffer() */ 426848b8605Smrg struct clear_state Clear; /**< For _mesa_meta_Clear() */ 427848b8605Smrg struct copypix_state CopyPix; /**< For _mesa_meta_CopyPixels() */ 428848b8605Smrg struct drawpix_state DrawPix; /**< For _mesa_meta_DrawPixels() */ 429848b8605Smrg struct bitmap_state Bitmap; /**< For _mesa_meta_Bitmap() */ 430848b8605Smrg struct gen_mipmap_state Mipmap; /**< For _mesa_meta_GenerateMipmap() */ 431848b8605Smrg struct decompress_state Decompress; /**< For texture decompression */ 432848b8605Smrg struct drawtex_state DrawTex; /**< For _mesa_meta_DrawTex() */ 433848b8605Smrg}; 434848b8605Smrg 435848b8605Smrgstruct vertex { 436848b8605Smrg GLfloat x, y, z, tex[4]; 437848b8605Smrg GLfloat r, g, b, a; 438848b8605Smrg}; 439848b8605Smrg 440848b8605Smrgextern void 441848b8605Smrg_mesa_meta_init(struct gl_context *ctx); 442848b8605Smrg 443848b8605Smrgextern void 444848b8605Smrg_mesa_meta_free(struct gl_context *ctx); 445848b8605Smrg 446848b8605Smrgextern void 447848b8605Smrg_mesa_meta_begin(struct gl_context *ctx, GLbitfield state); 448848b8605Smrg 449848b8605Smrgextern void 450848b8605Smrg_mesa_meta_end(struct gl_context *ctx); 451848b8605Smrg 452b8e80941Smrgstatic inline bool 453b8e80941Smrg_mesa_meta_in_progress(struct gl_context *ctx) 454b8e80941Smrg{ 455b8e80941Smrg return ctx->Meta->SaveStackDepth != 0; 456b8e80941Smrg} 457848b8605Smrg 458848b8605Smrgextern void 459b8e80941Smrg_mesa_meta_fb_tex_blit_begin(struct gl_context *ctx, 460848b8605Smrg struct fb_tex_blit_state *blit); 461848b8605Smrg 462848b8605Smrgextern void 463848b8605Smrg_mesa_meta_fb_tex_blit_end(struct gl_context *ctx, GLenum target, 464848b8605Smrg struct fb_tex_blit_state *blit); 465848b8605Smrg 466b8e80941Smrgextern struct gl_texture_object * 467b8e80941Smrg_mesa_meta_texture_object_from_renderbuffer(struct gl_context *ctx, 468b8e80941Smrg struct gl_renderbuffer *rb); 469848b8605Smrg 470b8e80941Smrgstruct gl_sampler_object * 471848b8605Smrg_mesa_meta_setup_sampler(struct gl_context *ctx, 472b8e80941Smrg struct gl_texture_object *texObj, 473848b8605Smrg GLenum target, GLenum filter, GLuint srcLevel); 474848b8605Smrg 475848b8605Smrgextern GLbitfield 476848b8605Smrg_mesa_meta_BlitFramebuffer(struct gl_context *ctx, 477b8e80941Smrg const struct gl_framebuffer *readFb, 478b8e80941Smrg const struct gl_framebuffer *drawFb, 479848b8605Smrg GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, 480848b8605Smrg GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, 481848b8605Smrg GLbitfield mask, GLenum filter); 482848b8605Smrg 483848b8605Smrgextern void 484848b8605Smrg_mesa_meta_and_swrast_BlitFramebuffer(struct gl_context *ctx, 485b8e80941Smrg struct gl_framebuffer *readFb, 486b8e80941Smrg struct gl_framebuffer *drawFb, 487848b8605Smrg GLint srcX0, GLint srcY0, 488848b8605Smrg GLint srcX1, GLint srcY1, 489848b8605Smrg GLint dstX0, GLint dstY0, 490848b8605Smrg GLint dstX1, GLint dstY1, 491848b8605Smrg GLbitfield mask, GLenum filter); 492848b8605Smrg 493848b8605Smrgextern void 494848b8605Smrg_mesa_meta_Clear(struct gl_context *ctx, GLbitfield buffers); 495848b8605Smrg 496848b8605Smrgextern void 497848b8605Smrg_mesa_meta_glsl_Clear(struct gl_context *ctx, GLbitfield buffers); 498848b8605Smrg 499848b8605Smrgextern void 500848b8605Smrg_mesa_meta_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, 501848b8605Smrg GLsizei width, GLsizei height, 502848b8605Smrg GLint dstx, GLint dsty, GLenum type); 503848b8605Smrg 504848b8605Smrgextern void 505848b8605Smrg_mesa_meta_DrawPixels(struct gl_context *ctx, 506848b8605Smrg GLint x, GLint y, GLsizei width, GLsizei height, 507848b8605Smrg GLenum format, GLenum type, 508848b8605Smrg const struct gl_pixelstore_attrib *unpack, 509848b8605Smrg const GLvoid *pixels); 510848b8605Smrg 511848b8605Smrgextern void 512848b8605Smrg_mesa_meta_Bitmap(struct gl_context *ctx, 513848b8605Smrg GLint x, GLint y, GLsizei width, GLsizei height, 514848b8605Smrg const struct gl_pixelstore_attrib *unpack, 515848b8605Smrg const GLubyte *bitmap); 516848b8605Smrg 517848b8605Smrgextern void 518848b8605Smrg_mesa_meta_GenerateMipmap(struct gl_context *ctx, GLenum target, 519848b8605Smrg struct gl_texture_object *texObj); 520848b8605Smrg 521848b8605Smrgextern void 522848b8605Smrg_mesa_meta_CopyTexSubImage(struct gl_context *ctx, GLuint dims, 523848b8605Smrg struct gl_texture_image *texImage, 524848b8605Smrg GLint xoffset, GLint yoffset, GLint slice, 525848b8605Smrg struct gl_renderbuffer *rb, 526848b8605Smrg GLint x, GLint y, 527848b8605Smrg GLsizei width, GLsizei height); 528848b8605Smrg 529848b8605Smrgextern void 530848b8605Smrg_mesa_meta_ClearTexSubImage(struct gl_context *ctx, 531848b8605Smrg struct gl_texture_image *texImage, 532848b8605Smrg GLint xoffset, GLint yoffset, GLint zoffset, 533848b8605Smrg GLsizei width, GLsizei height, GLsizei depth, 534848b8605Smrg const GLvoid *clearValue); 535848b8605Smrg 536848b8605Smrgextern void 537b8e80941Smrg_mesa_meta_GetTexSubImage(struct gl_context *ctx, 538b8e80941Smrg GLint xoffset, GLint yoffset, GLint zoffset, 539b8e80941Smrg GLsizei width, GLsizei height, GLsizei depth, 540b8e80941Smrg GLenum format, GLenum type, GLvoid *pixels, 541b8e80941Smrg struct gl_texture_image *texImage); 542848b8605Smrg 543848b8605Smrgextern void 544848b8605Smrg_mesa_meta_DrawTex(struct gl_context *ctx, GLfloat x, GLfloat y, GLfloat z, 545848b8605Smrg GLfloat width, GLfloat height); 546848b8605Smrg 547848b8605Smrg/* meta-internal functions */ 548848b8605Smrgvoid 549848b8605Smrg_mesa_meta_drawbuffers_from_bitfield(GLbitfield bits); 550848b8605Smrg 551b8e80941Smrgvoid 552b8e80941Smrg_mesa_meta_link_program_with_debug(struct gl_context *ctx, 553b8e80941Smrg struct gl_shader_program *sh_prog); 554848b8605Smrg 555848b8605Smrgvoid 556848b8605Smrg_mesa_meta_compile_and_link_program(struct gl_context *ctx, 557848b8605Smrg const char *vs_source, 558848b8605Smrg const char *fs_source, 559848b8605Smrg const char *name, 560b8e80941Smrg struct gl_shader_program **sh_prog_ptr); 561b8e80941Smrg 562b8e80941Smrgextern void 563b8e80941Smrg_mesa_meta_use_program(struct gl_context *ctx, 564b8e80941Smrg struct gl_shader_program *sh_prog); 565848b8605Smrg 566848b8605SmrgGLboolean 567848b8605Smrg_mesa_meta_alloc_texture(struct temp_texture *tex, 568848b8605Smrg GLsizei width, GLsizei height, GLenum intFormat); 569848b8605Smrg 570848b8605Smrgvoid 571848b8605Smrg_mesa_meta_setup_texture_coords(GLenum faceTarget, 572848b8605Smrg GLint slice, 573b8e80941Smrg GLint xoffset, 574b8e80941Smrg GLint yoffset, 575848b8605Smrg GLint width, 576848b8605Smrg GLint height, 577b8e80941Smrg GLint total_width, 578b8e80941Smrg GLint total_height, 579b8e80941Smrg GLint total_depth, 580848b8605Smrg GLfloat coords0[4], 581848b8605Smrg GLfloat coords1[4], 582848b8605Smrg GLfloat coords2[4], 583848b8605Smrg GLfloat coords3[4]); 584848b8605Smrg 585848b8605Smrgstruct temp_texture * 586848b8605Smrg_mesa_meta_get_temp_texture(struct gl_context *ctx); 587848b8605Smrg 588848b8605Smrgstruct temp_texture * 589848b8605Smrg_mesa_meta_get_temp_depth_texture(struct gl_context *ctx); 590848b8605Smrg 591848b8605Smrgvoid 592b8e80941Smrg_mesa_meta_setup_vertex_objects(struct gl_context *ctx, 593b8e80941Smrg GLuint *VAO, struct gl_buffer_object **buf_obj, 594848b8605Smrg bool use_generic_attributes, 595848b8605Smrg unsigned vertex_size, unsigned texcoord_size, 596848b8605Smrg unsigned color_size); 597848b8605Smrg 598848b8605Smrgvoid 599b8e80941Smrg_mesa_meta_setup_ff_tnl_for_blit(struct gl_context *ctx, 600b8e80941Smrg GLuint *VAO, struct gl_buffer_object **buf_obj, 601848b8605Smrg unsigned texcoord_size); 602848b8605Smrg 603848b8605Smrgvoid 604848b8605Smrg_mesa_meta_setup_drawpix_texture(struct gl_context *ctx, 605848b8605Smrg struct temp_texture *tex, 606848b8605Smrg GLboolean newTex, 607848b8605Smrg GLsizei width, GLsizei height, 608848b8605Smrg GLenum format, GLenum type, 609848b8605Smrg const GLvoid *pixels); 610848b8605Smrg 611848b8605Smrgvoid 612848b8605Smrg_mesa_meta_setup_copypix_texture(struct gl_context *ctx, 613848b8605Smrg struct temp_texture *tex, 614848b8605Smrg GLint srcX, GLint srcY, 615848b8605Smrg GLsizei width, GLsizei height, 616848b8605Smrg GLenum intFormat, 617848b8605Smrg GLenum filter); 618848b8605Smrg 619848b8605Smrgvoid 620848b8605Smrg_mesa_meta_setup_blit_shader(struct gl_context *ctx, 621848b8605Smrg GLenum target, 622b8e80941Smrg bool do_depth, 623848b8605Smrg struct blit_shader_table *table); 624848b8605Smrg 625848b8605Smrgvoid 626b8e80941Smrg_mesa_meta_glsl_blit_cleanup(struct gl_context *ctx, struct blit_state *blit); 627848b8605Smrg 628848b8605Smrgvoid 629b8e80941Smrg_mesa_meta_blit_shader_table_cleanup(struct gl_context *ctx, 630b8e80941Smrg struct blit_shader_table *table); 631848b8605Smrg 632848b8605Smrgvoid 633b8e80941Smrg_mesa_meta_glsl_generate_mipmap_cleanup(struct gl_context *ctx, 634b8e80941Smrg struct gen_mipmap_state *mipmap); 635848b8605Smrg 636848b8605Smrgvoid 637b8e80941Smrg_mesa_meta_framebuffer_texture_image(struct gl_context *ctx, 638b8e80941Smrg struct gl_framebuffer *fb, 639b8e80941Smrg GLenum attachment, 640b8e80941Smrg struct gl_texture_image *texImage, 641b8e80941Smrg GLuint layer); 642848b8605Smrg 643848b8605Smrg#endif /* META_H */ 644