};
+/**
+ * Compressed fog mode.
+ */
+enum gl_fog_mode
+{
+ FOG_NONE,
+ FOG_LINEAR,
+ FOG_EXP,
+ FOG_EXP2,
+};
+
+
/**
* Fog attribute group (GL_FOG_BIT).
*/
{
GLboolean Enabled; /**< Fog enabled flag */
GLboolean ColorSumEnabled;
+ uint8_t _PackedMode; /**< Fog mode as 2 bits */
+ uint8_t _PackedEnabledMode; /**< Masked CompressedMode */
GLfloat ColorUnclamped[4]; /**< Fog color */
GLfloat Color[4]; /**< Fog color */
GLfloat Density; /**< Density >= 0.0 */
};
+/** Compressed TexEnv effective Combine mode */
+enum gl_tex_env_mode
+{
+ TEXENV_MODE_REPLACE, /* r = a0 */
+ TEXENV_MODE_MODULATE, /* r = a0 * a1 */
+ TEXENV_MODE_ADD, /* r = a0 + a1 */
+ TEXENV_MODE_ADD_SIGNED, /* r = a0 + a1 - 0.5 */
+ TEXENV_MODE_INTERPOLATE, /* r = a0 * a2 + a1 * (1 - a2) */
+ TEXENV_MODE_SUBTRACT, /* r = a0 - a1 */
+ TEXENV_MODE_DOT3_RGB, /* r = a0 . a1 */
+ TEXENV_MODE_DOT3_RGB_EXT, /* r = a0 . a1 */
+ TEXENV_MODE_DOT3_RGBA, /* r = a0 . a1 */
+ TEXENV_MODE_DOT3_RGBA_EXT, /* r = a0 . a1 */
+ TEXENV_MODE_MODULATE_ADD_ATI, /* r = a0 * a2 + a1 */
+ TEXENV_MODE_MODULATE_SIGNED_ADD_ATI, /* r = a0 * a2 + a1 - 0.5 */
+ TEXENV_MODE_MODULATE_SUBTRACT_ATI, /* r = a0 * a2 - a1 */
+ TEXENV_MODE_ADD_PRODUCTS_NV, /* r = a0 * a1 + a2 * a3 */
+ TEXENV_MODE_ADD_PRODUCTS_SIGNED_NV, /* r = a0 * a1 + a2 * a3 - 0.5 */
+};
+
+
+/** Compressed TexEnv Combine source */
+enum gl_tex_env_source
+{
+ TEXENV_SRC_TEXTURE0,
+ TEXENV_SRC_TEXTURE1,
+ TEXENV_SRC_TEXTURE2,
+ TEXENV_SRC_TEXTURE3,
+ TEXENV_SRC_TEXTURE4,
+ TEXENV_SRC_TEXTURE5,
+ TEXENV_SRC_TEXTURE6,
+ TEXENV_SRC_TEXTURE7,
+ TEXENV_SRC_TEXTURE,
+ TEXENV_SRC_PREVIOUS,
+ TEXENV_SRC_PRIMARY_COLOR,
+ TEXENV_SRC_CONSTANT,
+ TEXENV_SRC_ZERO,
+ TEXENV_SRC_ONE,
+};
+
+
+/** Compressed TexEnv Combine operand */
+enum gl_tex_env_operand
+{
+ TEXENV_OPR_COLOR,
+ TEXENV_OPR_ONE_MINUS_COLOR,
+ TEXENV_OPR_ALPHA,
+ TEXENV_OPR_ONE_MINUS_ALPHA,
+};
+
+
+/** Compressed TexEnv Combine argument */
+struct gl_tex_env_argument
+{
+#ifdef __GNUC__
+ __extension__ uint8_t Source:4; /**< TEXENV_SRC_x */
+ __extension__ uint8_t Operand:2; /**< TEXENV_OPR_x */
+#else
+ uint8_t Source; /**< SRC_x */
+ uint8_t Operand; /**< OPR_x */
+#endif
+};
+
+
+/***
+ * Compressed TexEnv Combine state.
+ */
+struct gl_tex_env_combine_packed
+{
+ uint32_t ModeRGB:4; /**< Effective mode for RGB as 4 bits */
+ uint32_t ModeA:4; /**< Effective mode for RGB as 4 bits */
+ uint32_t ScaleShiftRGB:2; /**< 0, 1 or 2 */
+ uint32_t ScaleShiftA:2; /**< 0, 1 or 2 */
+ uint32_t NumArgsRGB:3; /**< Number of inputs used for the RGB combiner */
+ uint32_t NumArgsA:3; /**< Number of inputs used for the A combiner */
+ /** Source arguments in a packed manner */
+ struct gl_tex_env_argument ArgsRGB[MAX_COMBINER_TERMS];
+ struct gl_tex_env_argument ArgsA[MAX_COMBINER_TERMS];
+};
+
+
/**
* TexGenEnabled flags.
*/
/** Points to highest priority, complete and enabled texture object */
struct gl_texture_object *_Current;
+ /** Current compressed TexEnv & Combine state */
+ struct gl_tex_env_combine_packed _CurrentCombinePacked;
};
};
+/**
+ * A query object instance as described in INTEL_performance_query.
+ *
+ * NB: We want to keep this and the corresponding backend structure
+ * relatively lean considering that applications may expect to
+ * allocate enough objects to be able to query around all draw calls
+ * in a frame.
+ */
+struct gl_perf_query_object
+{
+ GLuint Id; /**< hash table ID/name */
+ unsigned Used:1; /**< has been used for 1 or more queries */
+ unsigned Active:1; /**< inside Begin/EndPerfQuery */
+ unsigned Ready:1; /**< result is ready? */
+};
+
+
/**
* Context state for AMD_performance_monitor.
*/
};
+/**
+ * Context state for INTEL_performance_query.
+ */
+struct gl_perf_query_state
+{
+ struct _mesa_HashTable *Objects; /**< The table of all performance query objects */
+};
+
+
/**
* Names of the various vertex/fragment program register files, etc.
*
/** FIXME: This must be first until we split shader_info from nir_shader */
struct shader_info info;
- mtx_t Mutex;
GLuint Id;
GLint RefCount;
GLubyte *String; /**< Null-terminated program text */
return external_samplers;
}
+/**
+ * Compile status enum. compile_skipped is used to indicate the compile
+ * was skipped due to the shader matching one that's been seen before by
+ * the on-disk cache.
+ */
+enum gl_compile_status
+{
+ compile_failure = 0,
+ compile_success,
+ compile_skipped,
+ compiled_no_opts
+};
+
/**
* A GLSL shader object.
*/
GLchar *Label; /**< GL_KHR_debug */
unsigned char sha1[20]; /**< SHA1 hash of pre-processed source */
GLboolean DeletePending;
- GLboolean CompileStatus;
+ enum gl_compile_status CompileStatus;
bool IsES; /**< True if this shader uses GLSL ES */
#ifdef DEBUG
unsigned NumUniformDataSlots;
union gl_constant_value *UniformDataSlots;
+ bool cache_fallback;
+
/** List of all active resources after linking. */
struct gl_program_resource *ProgramResourceList;
unsigned NumProgramResourceList;
#define GLSL_DUMP 0x1 /**< Dump shaders to stdout */
#define GLSL_LOG 0x2 /**< Write shaders to files */
-#define GLSL_OPT 0x4 /**< Force optimizations (override pragmas) */
-#define GLSL_NO_OPT 0x8 /**< Force no optimizations (override pragmas) */
-#define GLSL_UNIFORMS 0x10 /**< Print glUniform calls */
-#define GLSL_NOP_VERT 0x20 /**< Force no-op vertex shaders */
-#define GLSL_NOP_FRAG 0x40 /**< Force no-op fragment shaders */
-#define GLSL_USE_PROG 0x80 /**< Log glUseProgram calls */
-#define GLSL_REPORT_ERRORS 0x100 /**< Print compilation errors */
-#define GLSL_DUMP_ON_ERROR 0x200 /**< Dump shaders to stderr on compile error */
-#define GLSL_CACHE_INFO 0x400 /**< Print debug information about shader cache */
+#define GLSL_UNIFORMS 0x4 /**< Print glUniform calls */
+#define GLSL_NOP_VERT 0x8 /**< Force no-op vertex shaders */
+#define GLSL_NOP_FRAG 0x10 /**< Force no-op fragment shaders */
+#define GLSL_USE_PROG 0x20 /**< Log glUseProgram calls */
+#define GLSL_REPORT_ERRORS 0x40 /**< Print compilation errors */
+#define GLSL_DUMP_ON_ERROR 0x80 /**< Dump shaders to stderr on compile error */
+#define GLSL_CACHE_INFO 0x100 /**< Print debug information about shader cache */
/**
struct gl_query_object *PrimitivesGenerated[MAX_VERTEX_STREAMS];
struct gl_query_object *PrimitivesWritten[MAX_VERTEX_STREAMS];
+ /** GL_ARB_transform_feedback_overflow_query */
+ struct gl_query_object *TransformFeedbackOverflow[MAX_VERTEX_STREAMS];
+ struct gl_query_object *TransformFeedbackOverflowAny;
+
/** GL_ARB_timer_query */
struct gl_query_object *TimeElapsed;
*/
GLboolean AllowHigherCompatVersion;
+ /**
+ * Force computing the absolute value for sqrt() and inversesqrt() to follow
+ * D3D9 when apps rely on this behaviour.
+ */
+ GLboolean ForceGLSLAbsSqrt;
+
/**
* Force uninitialized variables to default to zero.
*/
/** GL_OES_primitive_bounding_box */
bool NoPrimitiveBoundingBoxOutput;
+
+ /** GL_ARB_sparse_buffer */
+ GLuint SparseBufferPageSize;
+
+ /** Used as an input for sha1 generation in the on-disk shader cache */
+ unsigned char *dri_config_options_sha1;
};
GLboolean ARB_seamless_cube_map;
GLboolean ARB_shader_atomic_counter_ops;
GLboolean ARB_shader_atomic_counters;
+ GLboolean ARB_shader_ballot;
GLboolean ARB_shader_bit_encoding;
GLboolean ARB_shader_clock;
GLboolean ARB_shader_draw_parameters;
GLboolean ARB_shading_language_packing;
GLboolean ARB_shading_language_420pack;
GLboolean ARB_shadow;
+ GLboolean ARB_sparse_buffer;
GLboolean ARB_stencil_texturing;
GLboolean ARB_sync;
GLboolean ARB_tessellation_shader;
GLboolean ARB_transform_feedback2;
GLboolean ARB_transform_feedback3;
GLboolean ARB_transform_feedback_instanced;
+ GLboolean ARB_transform_feedback_overflow_query;
GLboolean ARB_uniform_buffer_object;
GLboolean ARB_vertex_attrib_64bit;
GLboolean ARB_vertex_program;
GLboolean MESA_shader_integer_functions;
GLboolean MESA_ycbcr_texture;
GLboolean NV_conditional_render;
+ GLboolean NV_fill_rectangle;
GLboolean NV_fog_distance;
GLboolean NV_point_sprite;
GLboolean NV_primitive_restart;
#define _NEW_POLYGONSTIPPLE (1u << 13) /**< gl_context::PolygonStipple */
#define _NEW_SCISSOR (1u << 14) /**< gl_context::Scissor */
#define _NEW_STENCIL (1u << 15) /**< gl_context::Stencil */
-#define _NEW_TEXTURE (1u << 16) /**< gl_context::Texture */
+#define _NEW_TEXTURE_OBJECT (1u << 16) /**< gl_context::Texture (bindings only) */
#define _NEW_TRANSFORM (1u << 17) /**< gl_context::Transform */
#define _NEW_VIEWPORT (1u << 18) /**< gl_context::Viewport */
-/* gap, re-use for core Mesa state only; use ctx->DriverFlags otherwise */
+#define _NEW_TEXTURE_STATE (1u << 19) /**< gl_context::Texture (states only) */
#define _NEW_ARRAY (1u << 20) /**< gl_context::Array */
#define _NEW_RENDERMODE (1u << 21) /**< gl_context::RenderMode, etc */
#define _NEW_BUFFERS (1u << 22) /**< gl_context::Visual, DrawBuffer, */
* Composite state flags
*/
/*@{*/
+#define _NEW_TEXTURE (_NEW_TEXTURE_OBJECT | _NEW_TEXTURE_STATE)
+
#define _MESA_NEW_NEED_EYE_COORDS (_NEW_LIGHT | \
- _NEW_TEXTURE | \
+ _NEW_TEXTURE_STATE | \
_NEW_POINT | \
_NEW_PROGRAM | \
_NEW_MODELVIEW)
/** \name API function pointer tables */
/*@{*/
gl_api API;
+
/**
* The current dispatch table for non-displaylist-saving execution, either
* BeginEnd or OutsideBeginEnd
*/
struct _glapi_table *ContextLost;
/**
- * Tracks the current dispatch table out of the 4 above, so that it can be
- * re-set on glXMakeCurrent().
+ * Dispatch table used to marshal API calls from the client program to a
+ * separate server thread. NULL if API calls are not being marshalled to
+ * another thread.
+ */
+ struct _glapi_table *MarshalExec;
+ /**
+ * Dispatch table currently in use for fielding API calls from the client
+ * program. If API calls are being marshalled to another thread, this ==
+ * MarshalExec. Otherwise it == CurrentServerDispatch.
+ */
+ struct _glapi_table *CurrentClientDispatch;
+
+ /**
+ * Dispatch table currently in use for performing API calls. == Save or
+ * Exec.
*/
- struct _glapi_table *CurrentDispatch;
+ struct _glapi_table *CurrentServerDispatch;
+
/*@}*/
+ struct glthread_state *GLThread;
+
struct gl_config Visual;
struct gl_framebuffer *DrawBuffer; /**< buffer for writing */
struct gl_framebuffer *ReadBuffer; /**< buffer for reading */
struct gl_transform_feedback_state TransformFeedback;
struct gl_perf_monitor_state PerfMonitor;
+ struct gl_perf_query_state PerfQuery;
struct gl_buffer_object *DrawIndirectBuffer; /** < GL_ARB_draw_indirect */
struct gl_buffer_object *ParameterBuffer; /** < GL_ARB_indirect_parameters */