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