/** * \file dd.h * Device driver interfaces. */ /* * Mesa 3-D graphics library * * Copyright (C) 1999-2006 Brian Paul 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, sublicense, * 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 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 NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS 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 DD_INCLUDED #define DD_INCLUDED #include "glheader.h" #include "formats.h" #include "menums.h" #include "compiler/shader_enums.h" /* Windows winnt.h defines MemoryBarrier as a macro on some platforms, * including as a function-like macro in some cases. That either causes * the table entry below to have a weird name, or fail to compile. */ #ifdef MemoryBarrier #undef MemoryBarrier #endif struct gl_bitmap_atlas; struct gl_buffer_object; struct gl_context; struct gl_display_list; struct gl_framebuffer; struct gl_image_unit; struct gl_pixelstore_attrib; struct gl_program; struct gl_renderbuffer; struct gl_renderbuffer_attachment; struct gl_shader; struct gl_shader_program; struct gl_texture_image; struct gl_texture_object; struct gl_memory_info; struct gl_memory_object; struct gl_query_object; struct gl_sampler_object; struct gl_transform_feedback_object; struct gl_vertex_array_object; struct ati_fragment_shader; struct util_queue_monitoring; struct _mesa_prim; struct _mesa_index_buffer; struct pipe_draw_info; struct pipe_draw_start_count_bias; struct pipe_vertex_state; struct pipe_draw_vertex_state_info; struct pipe_vertex_buffer; struct pipe_vertex_element; /* GL_ARB_vertex_buffer_object */ /* Modifies GL_MAP_UNSYNCHRONIZED_BIT to allow driver to fail (return * NULL) if buffer is unavailable for immediate mapping. * * Does GL_MAP_INVALIDATE_RANGE_BIT do this? It seems so, but it * would require more book-keeping in the driver than seems necessary * at this point. * * Does GL_MAP_INVALDIATE_BUFFER_BIT do this? Not really -- we don't * want to provoke the driver to throw away the old storage, we will * respect the contents of already referenced data. */ #define MESA_MAP_NOWAIT_BIT 0x4000 /* Mapping a buffer is allowed from any thread. */ #define MESA_MAP_THREAD_SAFE_BIT 0x8000 /* This buffer will only be mapped/unmapped once */ #define MESA_MAP_ONCE 0x10000 /* This BufferStorage flag indicates that the buffer will be used * by pipe_vertex_state, which doesn't track buffer busyness and doesn't * support invalidations. */ #define MESA_GALLIUM_VERTEX_STATE_STORAGE 0x20000 /** * Device driver function table. * Core Mesa uses these function pointers to call into device drivers. * Most of these functions directly correspond to OpenGL state commands. * Core Mesa will call these functions after error checking has been done * so that the drivers don't have to worry about error testing. * * Vertex transformation/clipping/lighting is patched into the T&L module. * Rasterization functions are patched into the swrast module. * * Note: when new functions are added here, the drivers/common/driverfuncs.c * file should be updated too!!! */ struct dd_function_table { /** * \name Vertex/fragment program functions */ /** Allocate a new program */ struct gl_program * (*NewProgram)(struct gl_context *ctx, gl_shader_stage stage, GLuint id, bool is_arb_asm); /** * \name Draw functions. */ /*@{*/ /** * For indirect array drawing: * * typedef struct { * GLuint count; * GLuint primCount; * GLuint first; * GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise * } DrawArraysIndirectCommand; * * For indirect indexed drawing: * * typedef struct { * GLuint count; * GLuint primCount; * GLuint firstIndex; * GLint baseVertex; * GLuint baseInstance; // in GL 4.2 and later, must be zero otherwise * } DrawElementsIndirectCommand; */ /** * Optimal Gallium version of Draw() that doesn't require translation * of draw info in the state tracker. * * The interface is identical to pipe_context::draw_vbo * with indirect == NULL. * * "info" is not const and the following fields can be changed by * the callee, so callers should be aware: * - info->index_bounds_valid (if false) * - info->min_index (if index_bounds_valid is false) * - info->max_index (if index_bounds_valid is false) * - info->drawid (if increment_draw_id is true) * - info->index.gl_bo (if index_size && !has_user_indices) */ void (*DrawGallium)(struct gl_context *ctx, struct pipe_draw_info *info, unsigned drawid_offset, const struct pipe_draw_start_count_bias *draws, unsigned num_draws); /** * Same as DrawGallium, but mode can also change between draws. * * "info" is not const and the following fields can be changed by * the callee in addition to the fields listed by DrawGallium: * - info->mode * * This function exists to decrease complexity of DrawGallium. */ void (*DrawGalliumMultiMode)(struct gl_context *ctx, struct pipe_draw_info *info, const struct pipe_draw_start_count_bias *draws, const unsigned char *mode, unsigned num_draws); void (*DrawGalliumVertexState)(struct gl_context *ctx, struct pipe_vertex_state *state, struct pipe_draw_vertex_state_info info, const struct pipe_draw_start_count_bias *draws, const uint8_t *mode, unsigned num_draws, bool per_vertex_edgeflags); /*@}*/ struct pipe_vertex_state * (*CreateGalliumVertexState)(struct gl_context *ctx, const struct gl_vertex_array_object *vao, struct gl_buffer_object *indexbuf, uint32_t enabled_attribs); /** * \name Support for multiple T&L engines */ /*@{*/ /** * Set by the driver-supplied T&L engine. * * Set to PRIM_OUTSIDE_BEGIN_END when outside glBegin()/glEnd(). */ GLuint CurrentExecPrimitive; /** * Current glBegin state of an in-progress compilation. May be * GL_POINTS, GL_TRIANGLE_STRIP, etc. or PRIM_OUTSIDE_BEGIN_END * or PRIM_UNKNOWN. */ GLuint CurrentSavePrimitive; #define FLUSH_STORED_VERTICES 0x1 #define FLUSH_UPDATE_CURRENT 0x2 /** * Set by the driver-supplied T&L engine whenever vertices are buffered * between glBegin()/glEnd() objects or __struct gl_contextRec::Current * is not updated. A bitmask of the FLUSH_x values above. * * The dd_function_table::FlushVertices call below may be used to resolve * these conditions. */ GLbitfield NeedFlush; /** Need to call vbo_save_SaveFlushVertices() upon state change? */ GLboolean SaveNeedFlush; /**@}*/ /** * Query reset status for GL_ARB_robustness * * Per \c glGetGraphicsResetStatusARB, this function should return a * non-zero value once after a reset. If a reset is non-atomic, the * non-zero status should be returned for the duration of the reset. */ GLenum (*GetGraphicsResetStatus)(struct gl_context *ctx); /** * \name GL_ARB_get_program_binary */ /*@{*/ /** * Calls to retrieve/store a binary serialized copy of the current program. */ void (*ProgramBinarySerializeDriverBlob)(struct gl_context *ctx, struct gl_shader_program *shProg, struct gl_program *prog); void (*ProgramBinaryDeserializeDriverBlob)(struct gl_context *ctx, struct gl_shader_program *shProg, struct gl_program *prog); /*@}*/ /** * \name Disk shader cache functions */ /*@{*/ /** * Called to initialize gl_program::driver_cache_blob (and size) with a * ralloc allocated buffer. * * This buffer will be saved and restored as part of the gl_program * serialization and deserialization. */ void (*ShaderCacheSerializeDriverBlob)(struct gl_context *ctx, struct gl_program *prog); /*@}*/ GLboolean (*ValidateEGLImage)(struct gl_context *ctx, GLeglImageOES image_handle); }; #endif /* DD_INCLUDED */