st_context.h revision 848b8605
1/************************************************************************** 2 * 3 * Copyright 2003 VMware, Inc. 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 VMWARE 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 dd_function_table; 38struct draw_context; 39struct draw_stage; 40struct gen_mipmap_state; 41struct st_context; 42struct st_fragment_program; 43struct u_upload_mgr; 44 45 46#define ST_NEW_MESA (1 << 0) /* Mesa state has changed */ 47#define ST_NEW_FRAGMENT_PROGRAM (1 << 1) 48#define ST_NEW_VERTEX_PROGRAM (1 << 2) 49#define ST_NEW_FRAMEBUFFER (1 << 3) 50/* gap, re-use it */ 51#define ST_NEW_GEOMETRY_PROGRAM (1 << 5) 52#define ST_NEW_VERTEX_ARRAYS (1 << 6) 53#define ST_NEW_RASTERIZER (1 << 7) 54#define ST_NEW_UNIFORM_BUFFER (1 << 8) 55 56 57struct st_state_flags { 58 GLuint mesa; 59 GLuint st; 60}; 61 62struct st_tracked_state { 63 const char *name; 64 struct st_state_flags dirty; 65 void (*update)( struct st_context *st ); 66}; 67 68 69 70struct st_context 71{ 72 struct st_context_iface iface; 73 74 struct gl_context *ctx; 75 76 struct pipe_context *pipe; 77 78 struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader; 79 80 struct draw_context *draw; /**< For selection/feedback/rastpos only */ 81 struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */ 82 struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */ 83 struct draw_stage *rastpos_stage; /**< For glRasterPos */ 84 GLboolean clamp_frag_color_in_shader; 85 GLboolean clamp_vert_color_in_shader; 86 boolean has_stencil_export; /**< can do shader stencil export? */ 87 boolean has_time_elapsed; 88 boolean has_shader_model3; 89 boolean has_etc1; 90 boolean prefer_blit_based_texture_transfer; 91 92 boolean needs_texcoord_semantic; 93 boolean apply_texture_swizzle_to_border_color; 94 95 /* On old libGL's for linux we need to invalidate the drawables 96 * on glViewpport calls, this is set via a option. 97 */ 98 boolean invalidate_on_gl_viewport; 99 100 boolean vertex_array_out_of_memory; 101 102 /* Some state is contained in constant objects. 103 * Other state is just parameter values. 104 */ 105 struct { 106 struct pipe_blend_state blend; 107 struct pipe_depth_stencil_alpha_state depth_stencil; 108 struct pipe_rasterizer_state rasterizer; 109 struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; 110 GLuint num_samplers[PIPE_SHADER_TYPES]; 111 struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; 112 GLuint num_sampler_views[PIPE_SHADER_TYPES]; 113 struct pipe_clip_state clip; 114 struct { 115 void *ptr; 116 unsigned size; 117 } constants[PIPE_SHADER_TYPES]; 118 struct pipe_framebuffer_state framebuffer; 119 struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS]; 120 struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS]; 121 unsigned sample_mask; 122 123 GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */ 124 125 GLuint fb_orientation; 126 } state; 127 128 char vendor[100]; 129 char renderer[100]; 130 131 struct st_state_flags dirty; 132 133 GLboolean missing_textures; 134 GLboolean vertdata_edgeflags; 135 GLboolean edgeflag_culls_prims; 136 137 /** Mapping from VARYING_SLOT_x to post-transformed vertex slot */ 138 const GLuint *vertex_result_to_slot; 139 140 struct st_vertex_program *vp; /**< Currently bound vertex program */ 141 struct st_fragment_program *fp; /**< Currently bound fragment program */ 142 struct st_geometry_program *gp; /**< Currently bound geometry program */ 143 144 struct st_vp_variant *vp_variant; 145 struct st_fp_variant *fp_variant; 146 struct st_gp_variant *gp_variant; 147 148 struct gl_texture_object *default_texture; 149 150 struct { 151 struct gl_program_cache *cache; 152 struct st_fragment_program *program; /**< cur pixel transfer prog */ 153 GLuint xfer_prog_sn; /**< pixel xfer program serial no. */ 154 GLuint user_prog_sn; /**< user fragment program serial no. */ 155 struct st_fragment_program *combined_prog; 156 GLuint combined_prog_sn; 157 struct pipe_resource *pixelmap_texture; 158 struct pipe_sampler_view *pixelmap_sampler_view; 159 boolean pixelmap_enabled; /**< use the pixelmap texture? */ 160 } pixel_xfer; 161 162 /** for glBitmap */ 163 struct { 164 struct pipe_rasterizer_state rasterizer; 165 struct pipe_sampler_state samplers[2]; 166 enum pipe_format tex_format; 167 void *vs; 168 struct bitmap_cache *cache; 169 } bitmap; 170 171 /** for glDraw/CopyPixels */ 172 struct { 173 struct gl_fragment_program *shaders[4]; 174 void *vert_shaders[2]; /**< ureg shaders */ 175 } drawpix; 176 177 /** for glClear */ 178 struct { 179 struct pipe_rasterizer_state raster; 180 struct pipe_viewport_state viewport; 181 void *vs; 182 void *fs; 183 void *vs_layered; 184 void *gs_layered; 185 } clear; 186 187 /** used for anything using util_draw_vertex_buffer */ 188 struct pipe_vertex_element velems_util_draw[3]; 189 190 void *passthrough_fs; /**< simple pass-through frag shader */ 191 192 enum pipe_texture_target internal_target; 193 194 struct cso_context *cso_context; 195 196 void *winsys_drawable_handle; 197 198 /* The number of vertex buffers from the last call of validate_arrays. */ 199 unsigned last_num_vbuffers; 200 201 int32_t draw_stamp; 202 int32_t read_stamp; 203 204 struct st_config_options options; 205}; 206 207 208/* Need this so that we can implement Mesa callbacks in this module. 209 */ 210static INLINE struct st_context *st_context(struct gl_context *ctx) 211{ 212 return ctx->st; 213} 214 215 216/** 217 * Wrapper for struct gl_framebuffer. 218 * This is an opaque type to the outside world. 219 */ 220struct st_framebuffer 221{ 222 struct gl_framebuffer Base; 223 void *Private; 224 225 struct st_framebuffer_iface *iface; 226 enum st_attachment_type statts[ST_ATTACHMENT_COUNT]; 227 unsigned num_statts; 228 int32_t stamp; 229 int32_t iface_stamp; 230}; 231 232 233extern void st_init_driver_functions(struct dd_function_table *functions); 234 235void st_invalidate_state(struct gl_context * ctx, GLuint new_state); 236 237 238 239#define Y_0_TOP 1 240#define Y_0_BOTTOM 2 241 242static INLINE GLuint 243st_fb_orientation(const struct gl_framebuffer *fb) 244{ 245 if (fb && _mesa_is_winsys_fbo(fb)) { 246 /* Drawing into a window (on-screen buffer). 247 * 248 * Negate Y scale to flip image vertically. 249 * The NDC Y coords prior to viewport transformation are in the range 250 * [y=-1=bottom, y=1=top] 251 * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where 252 * H is the window height. 253 * Use the viewport transformation to invert Y. 254 */ 255 return Y_0_TOP; 256 } 257 else { 258 /* Drawing into user-created FBO (very likely a texture). 259 * 260 * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering. 261 */ 262 return Y_0_BOTTOM; 263 } 264} 265 266 267/** clear-alloc a struct-sized object, with casting */ 268#define ST_CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) 269 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 const struct st_config_options *options); 276 277extern void 278st_destroy_context(struct st_context *st); 279 280 281#endif 282