1 /** 2 * \file dd.h 3 * Device driver interfaces. 4 */ 5 6 /* 7 * Mesa 3-D graphics library 8 * 9 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a 12 * copy of this software and associated documentation files (the "Software"), 13 * to deal in the Software without restriction, including without limitation 14 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 * and/or sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be included 19 * in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 * OTHER DEALINGS IN THE SOFTWARE. 28 */ 29 30 31 #ifndef DD_INCLUDED 32 #define DD_INCLUDED 33 34 #include "glheader.h" 35 #include "formats.h" 36 #include "menums.h" 37 #include "compiler/shader_enums.h" 38 39 /* Windows winnt.h defines MemoryBarrier as a macro on some platforms, 40 * including as a function-like macro in some cases. That either causes 41 * the table entry below to have a weird name, or fail to compile. 42 */ 43 #ifdef MemoryBarrier 44 #undef MemoryBarrier 45 #endif 46 47 struct gl_bitmap_atlas; 48 struct gl_buffer_object; 49 struct gl_context; 50 struct gl_display_list; 51 struct gl_framebuffer; 52 struct gl_image_unit; 53 struct gl_pixelstore_attrib; 54 struct gl_program; 55 struct gl_renderbuffer; 56 struct gl_renderbuffer_attachment; 57 struct gl_shader; 58 struct gl_shader_program; 59 struct gl_texture_image; 60 struct gl_texture_object; 61 struct gl_memory_info; 62 struct gl_memory_object; 63 struct gl_query_object; 64 struct gl_sampler_object; 65 struct gl_transform_feedback_object; 66 struct gl_vertex_array_object; 67 struct ati_fragment_shader; 68 struct util_queue_monitoring; 69 struct _mesa_prim; 70 struct _mesa_index_buffer; 71 struct pipe_draw_info; 72 struct pipe_draw_start_count_bias; 73 struct pipe_vertex_state; 74 struct pipe_draw_vertex_state_info; 75 struct pipe_vertex_buffer; 76 struct pipe_vertex_element; 77 78 /* GL_ARB_vertex_buffer_object */ 79 /* Modifies GL_MAP_UNSYNCHRONIZED_BIT to allow driver to fail (return 80 * NULL) if buffer is unavailable for immediate mapping. 81 * 82 * Does GL_MAP_INVALIDATE_RANGE_BIT do this? It seems so, but it 83 * would require more book-keeping in the driver than seems necessary 84 * at this point. 85 * 86 * Does GL_MAP_INVALDIATE_BUFFER_BIT do this? Not really -- we don't 87 * want to provoke the driver to throw away the old storage, we will 88 * respect the contents of already referenced data. 89 */ 90 #define MESA_MAP_NOWAIT_BIT 0x4000 91 92 /* Mapping a buffer is allowed from any thread. */ 93 #define MESA_MAP_THREAD_SAFE_BIT 0x8000 94 95 /* This buffer will only be mapped/unmapped once */ 96 #define MESA_MAP_ONCE 0x10000 97 98 /* This BufferStorage flag indicates that the buffer will be used 99 * by pipe_vertex_state, which doesn't track buffer busyness and doesn't 100 * support invalidations. 101 */ 102 #define MESA_GALLIUM_VERTEX_STATE_STORAGE 0x20000 103 104 105 /** 106 * Device driver function table. 107 * Core Mesa uses these function pointers to call into device drivers. 108 * Most of these functions directly correspond to OpenGL state commands. 109 * Core Mesa will call these functions after error checking has been done 110 * so that the drivers don't have to worry about error testing. 111 * 112 * Vertex transformation/clipping/lighting is patched into the T&L module. 113 * Rasterization functions are patched into the swrast module. 114 * 115 * Note: when new functions are added here, the drivers/common/driverfuncs.c 116 * file should be updated too!!! 117 */ 118 struct dd_function_table { 119 /** 120 * \name Vertex/fragment program functions 121 */ 122 /** Allocate a new program */ 123 struct gl_program * (*NewProgram)(struct gl_context *ctx, 124 gl_shader_stage stage, 125 GLuint id, bool is_arb_asm); 126 /** 127 * \name Draw functions. 128 */ 129 /*@{*/ 130 /** 131 * For indirect array drawing: 132 * 133 * typedef struct { 134 * GLuint count; 135 * GLuint primCount; 136 * GLuint first; 137 * GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise 138 * } DrawArraysIndirectCommand; 139 * 140 * For indirect indexed drawing: 141 * 142 * typedef struct { 143 * GLuint count; 144 * GLuint primCount; 145 * GLuint firstIndex; 146 * GLint baseVertex; 147 * GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise 148 * } DrawElementsIndirectCommand; 149 */ 150 151 /** 152 * Optimal Gallium version of Draw() that doesn't require translation 153 * of draw info in the state tracker. 154 * 155 * The interface is identical to pipe_context::draw_vbo 156 * with indirect == NULL. 157 * 158 * "info" is not const and the following fields can be changed by 159 * the callee, so callers should be aware: 160 * - info->index_bounds_valid (if false) 161 * - info->min_index (if index_bounds_valid is false) 162 * - info->max_index (if index_bounds_valid is false) 163 * - info->drawid (if increment_draw_id is true) 164 * - info->index.gl_bo (if index_size && !has_user_indices) 165 */ 166 void (*DrawGallium)(struct gl_context *ctx, 167 struct pipe_draw_info *info, 168 unsigned drawid_offset, 169 const struct pipe_draw_start_count_bias *draws, 170 unsigned num_draws); 171 172 /** 173 * Same as DrawGallium, but mode can also change between draws. 174 * 175 * "info" is not const and the following fields can be changed by 176 * the callee in addition to the fields listed by DrawGallium: 177 * - info->mode 178 * 179 * This function exists to decrease complexity of DrawGallium. 180 */ 181 void (*DrawGalliumMultiMode)(struct gl_context *ctx, 182 struct pipe_draw_info *info, 183 const struct pipe_draw_start_count_bias *draws, 184 const unsigned char *mode, 185 unsigned num_draws); 186 187 void (*DrawGalliumVertexState)(struct gl_context *ctx, 188 struct pipe_vertex_state *state, 189 struct pipe_draw_vertex_state_info info, 190 const struct pipe_draw_start_count_bias *draws, 191 const uint8_t *mode, 192 unsigned num_draws, 193 bool per_vertex_edgeflags); 194 /*@}*/ 195 196 struct pipe_vertex_state * 197 (*CreateGalliumVertexState)(struct gl_context *ctx, 198 const struct gl_vertex_array_object *vao, 199 struct gl_buffer_object *indexbuf, 200 uint32_t enabled_attribs); 201 202 /** 203 * \name Support for multiple T&L engines 204 */ 205 /*@{*/ 206 207 /** 208 * Set by the driver-supplied T&L engine. 209 * 210 * Set to PRIM_OUTSIDE_BEGIN_END when outside glBegin()/glEnd(). 211 */ 212 GLuint CurrentExecPrimitive; 213 214 /** 215 * Current glBegin state of an in-progress compilation. May be 216 * GL_POINTS, GL_TRIANGLE_STRIP, etc. or PRIM_OUTSIDE_BEGIN_END 217 * or PRIM_UNKNOWN. 218 */ 219 GLuint CurrentSavePrimitive; 220 221 222 #define FLUSH_STORED_VERTICES 0x1 223 #define FLUSH_UPDATE_CURRENT 0x2 224 /** 225 * Set by the driver-supplied T&L engine whenever vertices are buffered 226 * between glBegin()/glEnd() objects or __struct gl_contextRec::Current 227 * is not updated. A bitmask of the FLUSH_x values above. 228 * 229 * The dd_function_table::FlushVertices call below may be used to resolve 230 * these conditions. 231 */ 232 GLbitfield NeedFlush; 233 234 /** Need to call vbo_save_SaveFlushVertices() upon state change? */ 235 GLboolean SaveNeedFlush; 236 237 /**@}*/ 238 239 /** 240 * Query reset status for GL_ARB_robustness 241 * 242 * Per \c glGetGraphicsResetStatusARB, this function should return a 243 * non-zero value once after a reset. If a reset is non-atomic, the 244 * non-zero status should be returned for the duration of the reset. 245 */ 246 GLenum (*GetGraphicsResetStatus)(struct gl_context *ctx); 247 248 /** 249 * \name GL_ARB_get_program_binary 250 */ 251 /*@{*/ 252 /** 253 * Calls to retrieve/store a binary serialized copy of the current program. 254 */ 255 void (*ProgramBinarySerializeDriverBlob)(struct gl_context *ctx, 256 struct gl_shader_program *shProg, 257 struct gl_program *prog); 258 259 void (*ProgramBinaryDeserializeDriverBlob)(struct gl_context *ctx, 260 struct gl_shader_program *shProg, 261 struct gl_program *prog); 262 /*@}*/ 263 264 /** 265 * \name Disk shader cache functions 266 */ 267 /*@{*/ 268 /** 269 * Called to initialize gl_program::driver_cache_blob (and size) with a 270 * ralloc allocated buffer. 271 * 272 * This buffer will be saved and restored as part of the gl_program 273 * serialization and deserialization. 274 */ 275 void (*ShaderCacheSerializeDriverBlob)(struct gl_context *ctx, 276 struct gl_program *prog); 277 /*@}*/ 278 279 GLboolean (*ValidateEGLImage)(struct gl_context *ctx, GLeglImageOES image_handle); 280 }; 281 282 #endif /* DD_INCLUDED */ 283