st_context.h revision 086734502a614e7778533018846ee66a66df9821
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 "mtypes.h" 32#include "pipe/p_state.h" 33 34 35struct st_context; 36struct st_region; 37struct st_texture_object; 38struct st_texture_image; 39struct st_fragment_program; 40struct draw_context; 41struct draw_stage; 42struct cso_cache; 43struct cso_blend; 44 45#define ST_NEW_MESA 0x1 /* Mesa state has changed */ 46#define ST_NEW_FRAGMENT_PROGRAM 0x2 47#define ST_NEW_VERTEX_PROGRAM 0x4 48 49struct st_state_flags { 50 GLuint mesa; 51 GLuint st; 52}; 53 54struct st_tracked_state { 55 const char *name; 56 struct st_state_flags dirty; 57 void (*update)( struct st_context *st ); 58}; 59 60 61 62 63struct st_context 64{ 65 GLcontext *ctx; 66 67 struct pipe_context *pipe; 68 69 struct draw_context *draw; /**< For selection/feedback */ 70 struct draw_stage *feedback_stage; /**< For FL_FEEDBACK rendermode */ 71 struct draw_stage *selection_stage; /**< For GL_SELECT rendermode */ 72 73 /* Eventually will use a cache to feed the pipe with 74 * create/bind/delete calls to constant state objects. Not yet 75 * though, we just shove random objects across the interface. 76 */ 77 struct { 78 const struct cso_blend *blend; 79 const struct cso_sampler *sampler[PIPE_MAX_SAMPLERS]; 80 const struct cso_depth_stencil *depth_stencil; 81 const struct cso_rasterizer *rasterizer; 82 const struct cso_fragment_shader *fs; 83 const struct cso_vertex_shader *vs; 84 85 struct pipe_alpha_test_state alpha_test; 86 struct pipe_blend_color blend_color; 87 struct pipe_clear_color_state clear_color; 88 struct pipe_clip_state clip; 89 struct pipe_constant_buffer constants[2]; 90 struct pipe_feedback_state feedback; 91 struct pipe_framebuffer_state framebuffer; 92 struct pipe_mipmap_tree *texture[PIPE_MAX_SAMPLERS]; 93 struct pipe_poly_stipple poly_stipple; 94 struct pipe_scissor_state scissor; 95 struct pipe_viewport_state viewport; 96 } state; 97 98 struct { 99 struct st_tracked_state tracked_state[2]; 100 } constants; 101 102 struct { 103 struct gl_fragment_program *fragment_program; 104 } cb; 105 106 struct { 107 GLuint frontbuffer_dirty:1; 108 } flags; 109 110 char vendor[100]; 111 char renderer[100]; 112 113 /* State to be validated: 114 */ 115 struct st_tracked_state **atoms; 116 GLuint nr_atoms; 117 118 struct st_state_flags dirty; 119 120 GLfloat polygon_offset_scale; /* ?? */ 121 122 /** Mapping from VERT_ATTRIB_x to post-transformed vertex slot */ 123 GLuint vertex_attrib_to_slot[VERT_RESULT_MAX]; 124 125 struct st_vertex_program *vp; /**< Currently bound vertex program */ 126 struct st_fragment_program *fp; /**< Currently bound fragment program */ 127 128 /** 129 * Buffer object which stores the ctx->Current.Attrib[] values. 130 * Used for vertex array drawing when we we need an attribute for 131 * which there's no enabled array. 132 */ 133 struct pipe_buffer_handle *default_attrib_buffer; 134 135 struct cso_cache *cache; 136}; 137 138 139/* Need this so that we can implement Mesa callbacks in this module. 140 */ 141static INLINE struct st_context *st_context(GLcontext *ctx) 142{ 143 return ctx->st; 144} 145 146 147extern void st_init_driver_functions(struct dd_function_table *functions); 148 149 150 151#define Y_0_TOP 1 152#define Y_0_BOTTOM 2 153 154static INLINE GLuint 155st_fb_orientation(const struct gl_framebuffer *fb) 156{ 157 if (fb && fb->Name == 0) { 158 /* Drawing into a window (on-screen buffer). 159 * 160 * Negate Y scale to flip image vertically. 161 * The NDC Y coords prior to viewport transformation are in the range 162 * [y=-1=bottom, y=1=top] 163 * Hardware window coords are in the range [y=0=top, y=H-1=bottom] where 164 * H is the window height. 165 * Use the viewport transformation to invert Y. 166 */ 167 return Y_0_TOP; 168 } 169 else { 170 /* Drawing into user-created FBO (very likely a texture). 171 * 172 * For textures, T=0=Bottom, so by extension Y=0=Bottom for rendering. 173 */ 174 return Y_0_BOTTOM; 175 } 176} 177 178 179#endif 180