| /************************************************************************** |
| * |
| * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. |
| * All Rights Reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the |
| * "Software"), to deal in the Software without restriction, including |
| * without limitation the rights to use, copy, modify, merge, publish, |
| * distribute, sub license, and/or sell copies of the Software, and to |
| * permit persons to whom the Software is furnished to do so, subject to |
| * the following conditions: |
| * |
| * The above copyright notice and this permission notice (including the |
| * next paragraph) shall be included in all copies or substantial portions |
| * of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
| * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR |
| * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
| * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| * |
| **************************************************************************/ |
| |
| #ifndef ST_CONTEXT_H |
| #define ST_CONTEXT_H |
| |
| #include "main/mtypes.h" |
| #include "pipe/p_state.h" |
| #include "state_tracker/st_api.h" |
| #include "main/fbobject.h" |
| |
| struct bitmap_cache; |
| struct blit_state; |
| struct dd_function_table; |
| struct draw_context; |
| struct draw_stage; |
| struct gen_mipmap_state; |
| struct st_context; |
| struct st_fragment_program; |
| struct u_upload_mgr; |
| |
| |
| #define ST_NEW_MESA (1 << 0) /* Mesa state has changed */ |
| #define ST_NEW_FRAGMENT_PROGRAM (1 << 1) |
| #define ST_NEW_VERTEX_PROGRAM (1 << 2) |
| #define ST_NEW_FRAMEBUFFER (1 << 3) |
| #define ST_NEW_EDGEFLAGS_DATA (1 << 4) |
| #define ST_NEW_GEOMETRY_PROGRAM (1 << 5) |
| #define ST_NEW_VERTEX_ARRAYS (1 << 6) |
| |
| |
| struct st_state_flags { |
| GLuint mesa; |
| GLuint st; |
| }; |
| |
| struct st_tracked_state { |
| const char *name; |
| struct st_state_flags dirty; |
| void (*update)( struct st_context *st ); |
| }; |
| |
| |
| |
| struct st_context |
| { |
| struct st_context_iface iface; |
| |
| struct gl_context *ctx; |
| |
| struct pipe_context *pipe; |
| |
| struct u_upload_mgr *uploader, *indexbuf_uploader, *constbuf_uploader; |
| |
| struct draw_context *draw; /**< For selection/feedback/rastpos only */ |
| struct draw_stage *feedback_stage; /**< For GL_FEEDBACK rendermode */ |
| struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */ |
| struct draw_stage *rastpos_stage; /**< For glRasterPos */ |
| GLboolean clamp_frag_color_in_shader; |
| GLboolean clamp_vert_color_in_shader; |
| boolean has_stencil_export; /**< can do shader stencil export? */ |
| |
| /* On old libGL's for linux we need to invalidate the drawables |
| * on glViewpport calls, this is set via a option. |
| */ |
| boolean invalidate_on_gl_viewport; |
| |
| boolean vertex_array_out_of_memory; |
| |
| /* Some state is contained in constant objects. |
| * Other state is just parameter values. |
| */ |
| struct { |
| struct pipe_blend_state blend; |
| struct pipe_depth_stencil_alpha_state depth_stencil; |
| struct pipe_rasterizer_state rasterizer; |
| struct pipe_sampler_state samplers[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; |
| GLuint num_samplers[PIPE_SHADER_TYPES]; |
| struct pipe_sampler_view *sampler_views[PIPE_SHADER_TYPES][PIPE_MAX_SAMPLERS]; |
| GLuint num_sampler_views[PIPE_SHADER_TYPES]; |
| struct pipe_clip_state clip; |
| struct { |
| void *ptr; |
| unsigned size; |
| } constants[PIPE_SHADER_TYPES]; |
| struct pipe_framebuffer_state framebuffer; |
| struct pipe_scissor_state scissor; |
| struct pipe_viewport_state viewport; |
| unsigned sample_mask; |
| |
| GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */ |
| |
| GLuint fb_orientation; |
| } state; |
| |
| char vendor[100]; |
| char renderer[100]; |
| |
| struct st_state_flags dirty; |
| |
| GLboolean missing_textures; |
| GLboolean vertdata_edgeflags; |
| |
| /** Mapping from VERT_RESULT_x to post-transformed vertex slot */ |
| const GLuint *vertex_result_to_slot; |
| |
| struct st_vertex_program *vp; /**< Currently bound vertex program */ |
| struct st_fragment_program *fp; /**< Currently bound fragment program */ |
| struct st_geometry_program *gp; /**< Currently bound geometry program */ |
| |
| struct st_vp_variant *vp_variant; |
| struct st_fp_variant *fp_variant; |
| struct st_gp_variant *gp_variant; |
| |
| struct gl_texture_object *default_texture; |
| |
| struct { |
| struct gl_program_cache *cache; |
| struct st_fragment_program *program; /**< cur pixel transfer prog */ |
| GLuint xfer_prog_sn; /**< pixel xfer program serial no. */ |
| GLuint user_prog_sn; /**< user fragment program serial no. */ |
| struct st_fragment_program *combined_prog; |
| GLuint combined_prog_sn; |
| struct pipe_resource *pixelmap_texture; |
| struct pipe_sampler_view *pixelmap_sampler_view; |
| boolean pixelmap_enabled; /**< use the pixelmap texture? */ |
| } pixel_xfer; |
| |
| /** for glBitmap */ |
| struct { |
| struct pipe_rasterizer_state rasterizer; |
| struct pipe_sampler_state samplers[2]; |
| enum pipe_format tex_format; |
| void *vs; |
| struct bitmap_cache *cache; |
| } bitmap; |
| |
| /** for glDraw/CopyPixels */ |
| struct { |
| struct gl_fragment_program *shaders[4]; |
| void *vert_shaders[2]; /**< ureg shaders */ |
| } drawpix; |
| |
| /** for glClear */ |
| struct { |
| struct pipe_rasterizer_state raster; |
| struct pipe_viewport_state viewport; |
| void *vs; |
| void *fs; |
| boolean enable_ds_separate; |
| } clear; |
| |
| /** used for anything using util_draw_vertex_buffer */ |
| struct pipe_vertex_element velems_util_draw[3]; |
| |
| void *passthrough_fs; /**< simple pass-through frag shader */ |
| |
| enum pipe_texture_target internal_target; |
| struct gen_mipmap_state *gen_mipmap; |
| struct blit_state *blit; |
| |
| struct cso_context *cso_context; |
| |
| int force_msaa; |
| void *winsys_drawable_handle; |
| |
| /* Active render condition. */ |
| struct pipe_query *render_condition; |
| unsigned condition_mode; |
| |
| int32_t draw_stamp; |
| int32_t read_stamp; |
| |
| struct st_config_options options; |
| }; |
| |
| |
| /* Need this so that we can implement Mesa callbacks in this module. |
| */ |
| static INLINE struct st_context *st_context(struct gl_context *ctx) |
| { |
| return ctx->st; |
| } |
| |
| |
| /** |
| * Wrapper for struct gl_framebuffer. |
| * This is an opaque type to the outside world. |
| */ |
| struct st_framebuffer |
| { |
| struct gl_framebuffer Base; |
| void *Private; |
| |
| struct st_framebuffer_iface *iface; |
| enum st_attachment_type statts[ST_ATTACHMENT_COUNT]; |
| unsigned num_statts; |
| int32_t stamp; |
| int32_t iface_stamp; |
| }; |
| |
| |
| extern void st_init_driver_functions(struct dd_function_table *functions); |
| |
| void st_invalidate_state(struct gl_context * ctx, GLuint new_state); |
| |
| |
| |
| #define Y_0_TOP 1 |
| #define Y_0_BOTTOM 2 |
| |
| static INLINE GLuint |
| st_fb_orientation(const struct gl_framebuffer *fb) |
| { |
| if (fb && _mesa_is_winsys_fbo(fb)) { |
| /* Drawing into a window (on-screen buffer). |
| * |
| * Negate Y scale to flip image vertically. |
| * The NDC Y coords prior to viewport transformation are in the range |
| * [y=-1=bottom, y=1=top] |
| * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where |
| * H is the window height. |
| * Use the viewport transformation to invert Y. |
| */ |
| return Y_0_TOP; |
| } |
| else { |
| /* Drawing into user-created FBO (very likely a texture). |
| * |
| * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering. |
| */ |
| return Y_0_BOTTOM; |
| } |
| } |
| |
| |
| /** clear-alloc a struct-sized object, with casting */ |
| #define ST_CALLOC_STRUCT(T) (struct T *) calloc(1, sizeof(struct T)) |
| |
| |
| extern int |
| st_get_msaa(void); |
| |
| extern struct st_context * |
| st_create_context(gl_api api, struct pipe_context *pipe, |
| const struct gl_config *visual, |
| struct st_context *share, |
| const struct st_config_options *options); |
| |
| extern void |
| st_destroy_context(struct st_context *st); |
| |
| |
| #endif |