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