text: /**
   * \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 */
  