1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef ST_CONTEXT_H
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_CONTEXT_H
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state_tracker/st_api.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/fbobject.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct bitmap_cache;
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct blit_state;
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct dd_function_table;
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_context;
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct draw_stage;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gen_mipmap_state;
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_context;
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_fragment_program;
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct u_upload_mgr;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_MESA                    (1 << 0) /* Mesa state has changed */
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_FRAGMENT_PROGRAM        (1 << 1)
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_VERTEX_PROGRAM          (1 << 2)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_FRAMEBUFFER             (1 << 3)
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_EDGEFLAGS_DATA          (1 << 4)
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_GEOMETRY_PROGRAM        (1 << 5)
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_NEW_VERTEX_ARRAYS           (1 << 6)
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_state_flags {
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint mesa;
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint st;
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_tracked_state {
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *name;
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_state_flags dirty;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void (*update)( struct st_context *st );
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_context
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_context_iface iface;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_context *pipe;
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_context *draw;  /**< For selection/feedback/rastpos only */
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_stage *feedback_stage;  /**< For GL_FEEDBACK rendermode */
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_stage *selection_stage;  /**< For GL_SELECT rendermode */
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct draw_stage *rastpos_stage;  /**< For glRasterPos */
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean clamp_frag_color_in_shader;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean clamp_vert_color_in_shader;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean has_stencil_export; /**< can do shader stencil export? */
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* On old libGL's for linux we need to invalidate the drawables
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * on glViewpport calls, this is set via a option.
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean invalidate_on_gl_viewport;
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean vertex_array_out_of_memory;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Some state is contained in constant objects.
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * Other state is just parameter values.
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_blend_state               blend;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_depth_stencil_alpha_state depth_stencil;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state          rasterizer;
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint num_samplers[PIPE_SHADER_TYPES];
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS];
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint num_sampler_views[PIPE_SHADER_TYPES];
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_clip_state clip;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct {
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         void *ptr;
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned size;
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } constants[PIPE_SHADER_TYPES];
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_framebuffer_state framebuffer;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_scissor_state scissor;
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_viewport_state viewport;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned sample_mask;
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint poly_stipple[32];  /**< In OpenGL's bottom-to-top order */
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint fb_orientation;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } state;
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char vendor[100];
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char renderer[100];
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_state_flags dirty;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean missing_textures;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean vertdata_edgeflags;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** Mapping from VERT_RESULT_x to post-transformed vertex slot */
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint *vertex_result_to_slot;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_vertex_program *vp;    /**< Currently bound vertex program */
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_fragment_program *fp;  /**< Currently bound fragment program */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_geometry_program *gp;  /**< Currently bound geometry program */
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_vp_variant *vp_variant;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_fp_variant *fp_variant;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_gp_variant *gp_variant;
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_texture_object *default_texture;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_program_cache *cache;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct st_fragment_program *program;  /**< cur pixel transfer prog */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint xfer_prog_sn;  /**< pixel xfer program serial no. */
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint user_prog_sn;  /**< user fragment program serial no. */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct st_fragment_program *combined_prog;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint combined_prog_sn;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_resource *pixelmap_texture;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_sampler_view *pixelmap_sampler_view;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean pixelmap_enabled;  /**< use the pixelmap texture? */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } pixel_xfer;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** for glBitmap */
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state rasterizer;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_sampler_state samplers[2];
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum pipe_format tex_format;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *vs;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct bitmap_cache *cache;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } bitmap;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** for glDraw/CopyPixels */
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct gl_fragment_program *shaders[4];
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *vert_shaders[2];   /**< ureg shaders */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } drawpix;
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** for glClear */
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_rasterizer_state raster;
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct pipe_viewport_state viewport;
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *vs;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      void *fs;
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean enable_ds_separate;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } clear;
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /** used for anything using util_draw_vertex_buffer */
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_vertex_element velems_util_draw[3];
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *passthrough_fs;  /**< simple pass-through frag shader */
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum pipe_texture_target internal_target;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gen_mipmap_state *gen_mipmap;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct blit_state *blit;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct cso_context *cso_context;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int force_msaa;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *winsys_drawable_handle;
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Active render condition. */
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct pipe_query *render_condition;
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned condition_mode;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t draw_stamp;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t read_stamp;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_config_options options;
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Need this so that we can implement Mesa callbacks in this module.
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct st_context *st_context(struct gl_context *ctx)
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->st;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Wrapper for struct gl_framebuffer.
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is an opaque type to the outside world.
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct st_framebuffer
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_framebuffer Base;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *Private;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct st_framebuffer_iface *iface;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum st_attachment_type statts[ST_ATTACHMENT_COUNT];
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned num_statts;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t stamp;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t iface_stamp;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void st_init_driver_functions(struct dd_function_table *functions);
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid st_invalidate_state(struct gl_context * ctx, GLuint new_state);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Y_0_TOP 1
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define Y_0_BOTTOM 2
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE GLuint
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgst_fb_orientation(const struct gl_framebuffer *fb)
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (fb && _mesa_is_winsys_fbo(fb)) {
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Drawing into a window (on-screen buffer).
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Negate Y scale to flip image vertically.
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * The NDC Y coords prior to viewport transformation are in the range
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * [y=-1=bottom, y=1=top]
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * H is the window height.
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * Use the viewport transformation to invert Y.
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return Y_0_TOP;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Drawing into user-created FBO (very likely a texture).
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       *
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering.
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return Y_0_BOTTOM;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** clear-alloc a struct-sized object, with casting */
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define ST_CALLOC_STRUCT(T)   (struct T *) calloc(1, sizeof(struct T))
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern int
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgst_get_msaa(void);
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern struct st_context *
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgst_create_context(gl_api api, struct pipe_context *pipe,
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const struct gl_config *visual,
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  struct st_context *share,
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const struct st_config_options *options);
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgextern void
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgst_destroy_context(struct st_context *st);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
279