ReactOS 0.4.17-dev-966-gf06eace
wined3d_gl.h File Reference
#include <stdbool.h>
#include <stdint.h>
#include "wine/wgl.h"
#include "wine/wgl_driver.h"
Include dependency graph for wined3d_gl.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  wined3d_fbo_ops
 
struct  wined3d_gl_limits
 
struct  wined3d_ffp_attrib_ops
 
struct  wined3d_gl_info
 
struct  min_lookup
 
struct  wined3d_bo_gl
 
union  wined3d_gl_fence_object
 
struct  wined3d_fence
 
struct  wined3d_event_query
 
struct  wined3d_occlusion_query
 
struct  wined3d_timestamp_query
 
union  wined3d_gl_so_statistics_query
 
struct  wined3d_so_statistics_query
 
union  wined3d_gl_pipeline_statistics_query
 
struct  wined3d_pipeline_statistics_query
 
struct  wined3d_gl_view
 
struct  wined3d_rendertarget_info
 
struct  wined3d_command_fence_gl
 
struct  wined3d_fbo_resource
 
struct  fbo_entry
 
struct  fbo_entry::wined3d_fbo_entry_key
 
struct  wined3d_context_gl
 
struct  wined3d_caps_gl_ctx
 
struct  wined3d_adapter_gl
 
struct  wined3d_allocator_chunk_gl
 
struct  wined3d_dummy_textures
 
struct  wined3d_device_gl
 
struct  wined3d_device_gl::wined3d_retired_block_gl
 
struct  gl_texture
 
struct  wined3d_renderbuffer_entry
 
struct  wined3d_texture_gl
 
struct  wined3d_blt_info
 
struct  wined3d_sampler_gl
 
struct  wined3d_buffer_gl
 
struct  wined3d_rendertarget_view_gl
 
struct  wined3d_shader_resource_view_gl
 
struct  wined3d_unordered_access_view_gl
 
struct  wined3d_swapchain_gl
 
struct  wined3d_format_gl
 

Macros

#define WINE_GLAPI   __stdcall
 
#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI   0x8837 /* not in the gl spec */
 
#define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT   0x00000001
 
#define WINED3D_QUIRK_GLSL_CLIP_VARYING   0x00000004
 
#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA   0x00000008
 
#define WINED3D_QUIRK_NV_CLIP_BROKEN   0x00000010
 
#define WINED3D_QUIRK_FBO_TEX_UPDATE   0x00000020
 
#define WINED3D_QUIRK_BROKEN_RGBA16   0x00000040
 
#define WINED3D_QUIRK_INFO_LOG_SPAM   0x00000080
 
#define WINED3D_QUIRK_LIMITED_TEX_FILTERING   0x00000100
 
#define WINED3D_QUIRK_BROKEN_ARB_FOG   0x00000200
 
#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS   0x00000400
 
#define GL_EXTCALL(f)   (gl_info->gl_ops.ext.p_##f)
 
#define checkGLcall(A)
 
#define MAX_GL_FRAGMENT_SAMPLERS   32
 
#define WINED3D_FBO_ENTRY_FLAG_ATTACHED   0x1
 
#define WINED3D_FBO_ENTRY_FLAG_DEPTH   0x2
 
#define WINED3D_FBO_ENTRY_FLAG_STENCIL   0x4
 

Typedefs

typedef void(WINE_GLAPI * wined3d_generic_attrib_func) (GLuint idx, const void *data)
 

Enumerations

enum  wined3d_gl_extension {
  WINED3D_GL_EXT_NONE , APPLE_FENCE , APPLE_FLOAT_PIXELS , APPLE_FLUSH_BUFFER_RANGE ,
  APPLE_FLUSH_RENDER , APPLE_RGB_422 , APPLE_YCBCR_422 , ARB_BASE_INSTANCE ,
  ARB_BLEND_FUNC_EXTENDED , ARB_BUFFER_STORAGE , ARB_CLEAR_BUFFER_OBJECT , ARB_CLEAR_TEXTURE ,
  ARB_CLIP_CONTROL , ARB_COLOR_BUFFER_FLOAT , ARB_COMPUTE_SHADER , ARB_CONSERVATIVE_DEPTH ,
  ARB_COPY_BUFFER , ARB_COPY_IMAGE , ARB_CULL_DISTANCE , ARB_DEBUG_OUTPUT ,
  ARB_DEPTH_BUFFER_FLOAT , ARB_DEPTH_CLAMP , ARB_DEPTH_TEXTURE , ARB_DERIVATIVE_CONTROL ,
  ARB_DRAW_BUFFERS , ARB_DRAW_BUFFERS_BLEND , ARB_DRAW_ELEMENTS_BASE_VERTEX , ARB_DRAW_INDIRECT ,
  ARB_DRAW_INSTANCED , ARB_ES2_COMPATIBILITY , ARB_ES3_COMPATIBILITY , ARB_EXPLICIT_ATTRIB_LOCATION ,
  ARB_FRAGMENT_COORD_CONVENTIONS , ARB_FRAGMENT_LAYER_VIEWPORT , ARB_FRAGMENT_PROGRAM , ARB_FRAGMENT_PROGRAM_SHADOW ,
  ARB_FRAGMENT_SHADER , ARB_FRAMEBUFFER_NO_ATTACHMENTS , ARB_FRAMEBUFFER_OBJECT , ARB_FRAMEBUFFER_SRGB ,
  ARB_GEOMETRY_SHADER4 , ARB_GPU_SHADER5 , ARB_HALF_FLOAT_PIXEL , ARB_HALF_FLOAT_VERTEX ,
  ARB_INSTANCED_ARRAYS , ARB_INTERNALFORMAT_QUERY , ARB_INTERNALFORMAT_QUERY2 , ARB_MAP_BUFFER_ALIGNMENT ,
  ARB_MAP_BUFFER_RANGE , ARB_MULTISAMPLE , ARB_MULTITEXTURE , ARB_OCCLUSION_QUERY ,
  ARB_PIPELINE_STATISTICS_QUERY , ARB_PIXEL_BUFFER_OBJECT , ARB_POINT_PARAMETERS , ARB_POINT_SPRITE ,
  ARB_POLYGON_OFFSET_CLAMP , ARB_PROVOKING_VERTEX , ARB_QUERY_BUFFER_OBJECT , ARB_SAMPLE_SHADING ,
  ARB_SAMPLER_OBJECTS , ARB_SEAMLESS_CUBE_MAP , ARB_SHADER_ATOMIC_COUNTERS , ARB_SHADER_VIEWPORT_LAYER_ARRAY ,
  ARB_SHADER_BIT_ENCODING , ARB_SHADER_IMAGE_LOAD_STORE , ARB_SHADER_IMAGE_SIZE , ARB_SHADER_STENCIL_EXPORT ,
  ARB_SHADER_STORAGE_BUFFER_OBJECT , ARB_SHADER_TEXTURE_IMAGE_SAMPLES , ARB_SHADER_TEXTURE_LOD , ARB_SHADING_LANGUAGE_100 ,
  ARB_SHADING_LANGUAGE_420PACK , ARB_SHADING_LANGUAGE_PACKING , ARB_SHADOW , ARB_STENCIL_TEXTURING ,
  ARB_SYNC , ARB_TESSELLATION_SHADER , ARB_TEXTURE_BORDER_CLAMP , ARB_TEXTURE_BUFFER_OBJECT ,
  ARB_TEXTURE_BUFFER_RANGE , ARB_TEXTURE_COMPRESSION , ARB_TEXTURE_COMPRESSION_BPTC , ARB_TEXTURE_COMPRESSION_RGTC ,
  ARB_TEXTURE_CUBE_MAP , ARB_TEXTURE_CUBE_MAP_ARRAY , ARB_TEXTURE_ENV_COMBINE , ARB_TEXTURE_ENV_DOT3 ,
  ARB_TEXTURE_FILTER_ANISOTROPIC , ARB_TEXTURE_FLOAT , ARB_TEXTURE_GATHER , ARB_TEXTURE_MIRRORED_REPEAT ,
  ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE , ARB_TEXTURE_MULTISAMPLE , ARB_TEXTURE_NON_POWER_OF_TWO , ARB_TEXTURE_QUERY_LEVELS ,
  ARB_TEXTURE_RG , ARB_TEXTURE_RGB10_A2UI , ARB_TEXTURE_STORAGE , ARB_TEXTURE_STORAGE_MULTISAMPLE ,
  ARB_TEXTURE_SWIZZLE , ARB_TEXTURE_VIEW , ARB_TIMER_QUERY , ARB_TRANSFORM_FEEDBACK2 ,
  ARB_TRANSFORM_FEEDBACK3 , ARB_UNIFORM_BUFFER_OBJECT , ARB_VERTEX_ARRAY_BGRA , ARB_VERTEX_BUFFER_OBJECT ,
  ARB_VERTEX_PROGRAM , ARB_VERTEX_SHADER , ARB_VERTEX_TYPE_10F_11F_11F_REV , ARB_VERTEX_TYPE_2_10_10_10_REV ,
  ARB_VIEWPORT_ARRAY , ARB_TEXTURE_BARRIER , ATI_FRAGMENT_SHADER , ATI_SEPARATE_STENCIL ,
  ATI_TEXTURE_COMPRESSION_3DC , ATI_TEXTURE_ENV_COMBINE3 , ATI_TEXTURE_MIRROR_ONCE , EXT_BLEND_COLOR ,
  EXT_BLEND_EQUATION_SEPARATE , EXT_BLEND_FUNC_SEPARATE , EXT_BLEND_MINMAX , EXT_BLEND_SUBTRACT ,
  EXT_DEPTH_BOUNDS_TEST , EXT_DRAW_BUFFERS2 , EXT_FOG_COORD , EXT_FRAMEBUFFER_BLIT ,
  EXT_FRAMEBUFFER_MULTISAMPLE , EXT_FRAMEBUFFER_MULTISAMPLE_BLIT_SCALED , EXT_FRAMEBUFFER_OBJECT , EXT_GPU_PROGRAM_PARAMETERS ,
  EXT_GPU_SHADER4 , EXT_MEMORY_OBJECT , EXT_PACKED_DEPTH_STENCIL , EXT_PACKED_FLOAT ,
  EXT_POINT_PARAMETERS , EXT_PROVOKING_VERTEX , EXT_SECONDARY_COLOR , EXT_SHADER_INTEGER_MIX ,
  EXT_STENCIL_TWO_SIDE , EXT_STENCIL_WRAP , EXT_TEXTURE3D , EXT_TEXTURE_ARRAY ,
  EXT_TEXTURE_COMPRESSION_RGTC , EXT_TEXTURE_COMPRESSION_S3TC , EXT_TEXTURE_ENV_COMBINE , EXT_TEXTURE_ENV_DOT3 ,
  EXT_TEXTURE_INTEGER , EXT_TEXTURE_LOD_BIAS , EXT_TEXTURE_MIRROR_CLAMP , EXT_TEXTURE_SHADOW_LOD ,
  EXT_TEXTURE_SHARED_EXPONENT , EXT_TEXTURE_SNORM , EXT_TEXTURE_SRGB , EXT_TEXTURE_SRGB_DECODE ,
  NV_FENCE , NV_FOG_DISTANCE , NV_FRAGMENT_PROGRAM , NV_FRAGMENT_PROGRAM2 ,
  NV_FRAGMENT_PROGRAM_OPTION , NV_HALF_FLOAT , NV_LIGHT_MAX_EXPONENT , NV_POINT_SPRITE ,
  NV_REGISTER_COMBINERS , NV_REGISTER_COMBINERS2 , NV_TEXGEN_REFLECTION , NV_TEXTURE_ENV_COMBINE4 ,
  NV_TEXTURE_SHADER , NV_TEXTURE_SHADER2 , NV_VERTEX_PROGRAM , NV_VERTEX_PROGRAM1_1 ,
  NV_VERTEX_PROGRAM2 , NV_VERTEX_PROGRAM2_OPTION , NV_VERTEX_PROGRAM3 , NV_TEXTURE_BARRIER ,
  WGL_ARB_PIXEL_FORMAT , WGL_EXT_SWAP_CONTROL , WGL_WINE_PIXEL_FORMAT_PASSTHROUGH , WGL_WINE_QUERY_RENDERER ,
  WINED3D_GL_BLEND_EQUATION , WINED3D_GL_LEGACY_CONTEXT , WINED3D_GL_NORMALIZED_TEXRECT , WINED3D_GL_PRIMITIVE_QUERY ,
  WINED3D_GL_VERSION_2_0 , WINED3D_GL_VERSION_3_2 , WINED3D_GLSL_130 , WINED3D_GL_EXT_COUNT
}
 
enum  wined3d_fence_result {
  WINED3D_FENCE_OK , WINED3D_FENCE_WAITING , WINED3D_FENCE_NOT_STARTED , WINED3D_FENCE_WRONG_THREAD ,
  WINED3D_FENCE_ERROR
}
 

Functions

void wined3d_gl_limits_get_texture_unit_range (const struct wined3d_gl_limits *gl_limits, enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count)
 
void wined3d_gl_limits_get_uniform_block_range (const struct wined3d_gl_limits *gl_limits, enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count)
 
void install_gl_compat_wrapper (struct wined3d_gl_info *gl_info, enum wined3d_gl_extension ext)
 
void print_glsl_info_log (const struct wined3d_gl_info *gl_info, GLuint id, BOOL program)
 
void shader_glsl_validate_link (const struct wined3d_gl_info *gl_info, GLuint program)
 
GLenum wined3d_buffer_gl_binding_from_bind_flags (const struct wined3d_gl_info *gl_info, uint32_t bind_flags)
 
void wined3d_check_gl_call (const struct wined3d_gl_info *gl_info, const char *file, unsigned int line, const char *name)
 
static GLenum wined3d_gl_mag_filter (enum wined3d_texture_filter_type mag_filter)
 
static GLenum wined3d_gl_min_mip_filter (enum wined3d_texture_filter_type min_filter, enum wined3d_texture_filter_type mip_filter)
 
GLenum wined3d_gl_compare_func (enum wined3d_cmp_func f)
 
const char * debug_fboattachment (GLenum attachment)
 
const char * debug_fbostatus (GLenum status)
 
const char * debug_glerror (GLenum error)
 
static bool wined3d_fence_supported (const struct wined3d_gl_info *gl_info)
 
static struct wined3d_bo_gl * wined3d_bo_gl (struct wined3d_bo *bo)
 
static GLuint wined3d_bo_gl_id (struct wined3d_bo *bo)
 
HRESULT wined3d_fence_create (struct wined3d_device *device, struct wined3d_fence **fence)
 
void wined3d_fence_destroy (struct wined3d_fence *fence)
 
void wined3d_fence_issue (struct wined3d_fence *fence, struct wined3d_device *device)
 
enum wined3d_fence_result wined3d_fence_wait (const struct wined3d_fence *fence, struct wined3d_device *device)
 
enum wined3d_fence_result wined3d_fence_test (const struct wined3d_fence *fence, struct wined3d_device *device, uint32_t flags)
 
HRESULT wined3d_query_gl_create (struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
 
void wined3d_query_gl_destroy_buffer_object (struct wined3d_context_gl *context_gl, struct wined3d_query *query)
 
static struct wined3d_context_gl * wined3d_context_gl (struct wined3d_context *context)
 
static const struct wined3d_context_gl * wined3d_context_gl_const (const struct wined3d_context *context)
 
HGLRC context_create_wgl_attribs (const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx)
 
DWORD context_get_tls_idx (void)
 
void context_gl_apply_texture_draw_state (struct wined3d_context_gl *context_gl, struct wined3d_texture *texture, unsigned int sub_resource_idx, unsigned int location)
 
void context_gl_resource_released (struct wined3d_device *device, GLuint name, BOOL rb_namespace)
 
struct wined3d_context * wined3d_context_gl_acquire (const struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
 
void wined3d_context_gl_active_texture (struct wined3d_context_gl *context_gl, const struct wined3d_gl_info *gl_info, unsigned int unit)
 
void wined3d_context_gl_alloc_fence (struct wined3d_context_gl *context_gl, struct wined3d_fence *fence)
 
void wined3d_context_gl_alloc_occlusion_query (struct wined3d_context_gl *context_gl, struct wined3d_occlusion_query *query)
 
void wined3d_context_gl_alloc_pipeline_statistics_query (struct wined3d_context_gl *context_gl, struct wined3d_pipeline_statistics_query *query)
 
void wined3d_context_gl_alloc_so_statistics_query (struct wined3d_context_gl *context_gl, struct wined3d_so_statistics_query *query)
 
void wined3d_context_gl_alloc_timestamp_query (struct wined3d_context_gl *context_gl, struct wined3d_timestamp_query *query)
 
GLuint wined3d_context_gl_allocate_vram_chunk_buffer (struct wined3d_context_gl *context_gl, unsigned int pool, size_t size)
 
void wined3d_context_gl_apply_blit_state (struct wined3d_context_gl *context_gl, const struct wined3d_device *device)
 
BOOL wined3d_context_gl_apply_clear_state (struct wined3d_context_gl *context_gl, const struct wined3d_state *state, unsigned int rt_count, const struct wined3d_fb_state *fb)
 
void wined3d_context_gl_apply_fbo_state_explicit (struct wined3d_context_gl *context_gl, GLenum target, struct wined3d_resource *rt, unsigned int rt_sub_resource_idx, struct wined3d_resource *ds, unsigned int ds_sub_resource_idx, uint32_t location)
 
void wined3d_context_gl_bind_bo (struct wined3d_context_gl *context_gl, GLenum binding, GLuint name)
 
void wined3d_context_gl_bind_dummy_textures (const struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_bind_texture (struct wined3d_context_gl *context_gl, GLenum target, GLuint name)
 
void wined3d_context_gl_check_fbo_status (const struct wined3d_context_gl *context_gl, GLenum target)
 
void wined3d_context_gl_copy_bo_address (struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, unsigned int range_count, const struct wined3d_range *ranges, uint32_t map_flags)
 
void wined3d_context_gl_destroy (struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_destroy_bo (struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo)
 
void wined3d_context_gl_draw_shaded_quad (struct wined3d_context_gl *context_gl, struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx, const RECT *src_rect, const RECT *dst_rect, enum wined3d_texture_filter_type filter)
 
void wined3d_context_gl_enable_clip_distances (struct wined3d_context_gl *context_gl, uint32_t mask)
 
void wined3d_context_gl_end_transform_feedback (struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_flush_bo_address (struct wined3d_context_gl *context_gl, const struct wined3d_const_bo_address *data, size_t size)
 
void wined3d_context_gl_free_fence (struct wined3d_fence *fence)
 
void wined3d_context_gl_free_occlusion_query (struct wined3d_occlusion_query *query)
 
void wined3d_context_gl_free_pipeline_statistics_query (struct wined3d_pipeline_statistics_query *query)
 
void wined3d_context_gl_free_so_statistics_query (struct wined3d_so_statistics_query *query)
 
void wined3d_context_gl_free_timestamp_query (struct wined3d_timestamp_query *query)
 
struct wined3d_context_gl * wined3d_context_gl_get_current (void)
 
GLenum wined3d_context_gl_get_offscreen_gl_buffer (const struct wined3d_context_gl *context_gl)
 
const unsigned int * wined3d_context_gl_get_tex_unit_mapping (const struct wined3d_context_gl *context_gl, const struct wined3d_shader_version *shader_version, unsigned int *base, unsigned int *count)
 
HRESULT wined3d_context_gl_init (struct wined3d_context_gl *context_gl, struct wined3d_swapchain_gl *swapchain_gl)
 
void * wined3d_context_gl_map_bo_address (struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, size_t size, uint32_t flags)
 
struct wined3d_context_gl * wined3d_context_gl_reacquire (struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_release (struct wined3d_context_gl *context_gl)
 
BOOL wined3d_context_gl_set_current (struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_submit_command_fence (struct wined3d_context_gl *context_gl)
 
void wined3d_context_gl_texture_update (struct wined3d_context_gl *context_gl, const struct wined3d_texture_gl *texture_gl)
 
void wined3d_context_gl_unmap_bo_address (struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
 
void wined3d_context_gl_update_stream_sources (struct wined3d_context_gl *context_gl, const struct wined3d_state *state)
 
void wined3d_context_gl_wait_command_fence (struct wined3d_context_gl *context_gl, uint64_t id)
 
void wined3d_fbo_blitter_create (struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
 
void wined3d_ffp_blitter_create (struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
 
struct wined3d_blitter * wined3d_glsl_blitter_create (struct wined3d_blitter **next, const struct wined3d_device *device)
 
void wined3d_raw_blitter_create (struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
 
void ffp_vertex_update_clip_plane_constants (const struct wined3d_gl_info *gl_info, const struct wined3d_state *state)
 
BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits (struct wined3d_caps_gl_ctx *ctx)
 
bool wined3d_caps_gl_ctx_test_filling_convention (struct wined3d_caps_gl_ctx *ctx, float offset)
 
static struct wined3d_adapter_gl * wined3d_adapter_gl (struct wined3d_adapter *adapter)
 
static const struct wined3d_adapter_gl * wined3d_adapter_gl_const (const struct wined3d_adapter *adapter)
 
BOOL wined3d_adapter_gl_init_format_info (struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx)
 
static struct wined3d_allocator_chunk_gl * wined3d_allocator_chunk_gl (struct wined3d_allocator_chunk *chunk)
 
static struct wined3d_device_gl * wined3d_device_gl (struct wined3d_device *device)
 
static struct wined3d_device_gl * wined3d_device_gl_from_allocator (struct wined3d_allocator *allocator)
 
static void wined3d_device_gl_allocator_lock (struct wined3d_device_gl *device_gl)
 
static void wined3d_device_gl_allocator_unlock (struct wined3d_device_gl *device_gl)
 
static void wined3d_allocator_chunk_gl_lock (struct wined3d_allocator_chunk_gl *chunk_gl)
 
static void wined3d_allocator_chunk_gl_unlock (struct wined3d_allocator_chunk_gl *chunk_gl)
 
bool wined3d_device_gl_create_bo (struct wined3d_device_gl *device_gl, struct wined3d_context_gl *context_gl, GLsizeiptr size, GLenum binding, GLenum usage, bool coherent, GLbitfield flags, struct wined3d_bo_gl *bo)
 
void wined3d_device_gl_create_primary_opengl_context_cs (void *object)
 
void wined3d_device_gl_delete_opengl_contexts_cs (void *object)
 
HDC wined3d_device_gl_get_backup_dc (struct wined3d_device_gl *device_gl)
 
GLbitfield wined3d_device_gl_get_memory_type_flags (unsigned int memory_type_idx)
 
GLbitfield wined3d_resource_gl_map_flags (const struct wined3d_bo_gl *bo, DWORD d3d_flags)
 
GLenum wined3d_resource_gl_legacy_map_flags (DWORD d3d_flags)
 
GLbitfield wined3d_resource_gl_storage_flags (const struct wined3d_resource *resource)
 
static void wined3d_context_gl_reference_bo (struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo_gl)
 
static void wined3d_context_gl_reference_buffer (struct wined3d_context_gl *context_gl, struct wined3d_buffer *buffer)
 
static struct wined3d_texture_gl * wined3d_texture_gl (struct wined3d_texture *texture)
 
static struct gl_texture * wined3d_texture_gl_get_gl_texture (struct wined3d_texture_gl *texture_gl, bool srgb)
 
static GLenum wined3d_texture_gl_get_sub_resource_target (const struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx)
 
static GLuint wined3d_texture_gl_get_texture_name (const struct wined3d_texture_gl *texture_gl, const struct wined3d_context *context, bool srgb)
 
static bool wined3d_texture_gl_is_multisample_location (const struct wined3d_texture_gl *texture_gl, uint32_t location)
 
void texture2d_get_blt_info (const struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx, const RECT *rect, struct wined3d_blt_info *info)
 
void texture2d_read_from_framebuffer (struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, DWORD src_location, DWORD dst_location)
 
void wined3d_gl_texture_swizzle_from_color_fixup (GLint swizzle[4], struct color_fixup_desc fixup)
 
GLenum wined3d_texture_get_gl_buffer (const struct wined3d_texture *texture)
 
void wined3d_texture_gl_apply_sampler_desc (struct wined3d_texture_gl *texture_gl, const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context_gl *context_gl)
 
void wined3d_texture_gl_bind (struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb)
 
void wined3d_texture_gl_bind_and_dirtify (struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb)
 
HRESULT wined3d_texture_gl_init (struct wined3d_texture_gl *texture_gl, struct wined3d_device *device, const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, uint32_t flags, void *parent, const struct wined3d_parent_ops *parent_ops)
 
void wined3d_texture_gl_prepare_texture (struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb)
 
void wined3d_texture_gl_set_compatible_renderbuffer (struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, unsigned int level, const struct wined3d_rendertarget_info *rt)
 
static struct wined3d_sampler_gl * wined3d_sampler_gl (struct wined3d_sampler *sampler)
 
void wined3d_sampler_gl_bind (struct wined3d_sampler_gl *sampler_gl, unsigned int unit, struct wined3d_texture_gl *texture_gl, const struct wined3d_context_gl *context_gl)
 
void wined3d_sampler_gl_init (struct wined3d_sampler_gl *sampler_gl, struct wined3d_device *device, const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static struct wined3d_buffer_gl * wined3d_buffer_gl (struct wined3d_buffer *buffer)
 
static const struct wined3d_buffer_gl * wined3d_buffer_gl_const (const struct wined3d_buffer *buffer)
 
HRESULT wined3d_buffer_gl_init (struct wined3d_buffer_gl *buffer_gl, struct wined3d_device *device, const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static struct wined3d_rendertarget_view_gl * wined3d_rendertarget_view_gl (struct wined3d_rendertarget_view *view)
 
HRESULT wined3d_rendertarget_view_gl_init (struct wined3d_rendertarget_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static struct wined3d_shader_resource_view_gl * wined3d_shader_resource_view_gl (struct wined3d_shader_resource_view *view)
 
void wined3d_shader_resource_view_gl_bind (struct wined3d_shader_resource_view_gl *view_gl, unsigned int unit, struct wined3d_sampler_gl *sampler_gl, struct wined3d_context_gl *context_gl)
 
void wined3d_shader_resource_view_gl_generate_mipmap (struct wined3d_shader_resource_view_gl *srv_gl, struct wined3d_context_gl *context_gl)
 
HRESULT wined3d_shader_resource_view_gl_init (struct wined3d_shader_resource_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
 
void wined3d_shader_resource_view_gl_update (struct wined3d_shader_resource_view_gl *srv_gl, struct wined3d_context_gl *context_gl)
 
static struct wined3d_unordered_access_view_gl * wined3d_unordered_access_view_gl (struct wined3d_unordered_access_view *view)
 
void wined3d_unordered_access_view_gl_clear (struct wined3d_unordered_access_view_gl *view_gl, const struct wined3d_uvec4 *clear_value, struct wined3d_context_gl *context_gl, bool fp)
 
HRESULT wined3d_unordered_access_view_gl_init (struct wined3d_unordered_access_view_gl *view_gl, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
 
void wined3d_unordered_access_view_gl_update (struct wined3d_unordered_access_view_gl *uav_gl, struct wined3d_context_gl *context_gl)
 
static struct wined3d_swapchain_gl * wined3d_swapchain_gl (struct wined3d_swapchain *swapchain)
 
void wined3d_swapchain_gl_cleanup (struct wined3d_swapchain_gl *swapchain_gl)
 
struct wined3d_context_gl * wined3d_swapchain_gl_get_context (struct wined3d_swapchain_gl *swapchain_gl)
 
HRESULT wined3d_swapchain_gl_init (struct wined3d_swapchain_gl *swapchain_gl, struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops)
 
static const struct wined3d_format_gl * wined3d_format_gl (const struct wined3d_format *format)
 
static GLuint wined3d_gl_get_internal_format (struct wined3d_resource *resource, const struct wined3d_format_gl *format_gl, bool srgb)
 

Variables

const struct min_lookup minMipLookup [WINED3D_TEXF_LINEAR+1]
 
const GLenum magLookup [WINED3D_TEXF_LINEAR+1]
 

Macro Definition Documentation

◆ checkGLcall

#define checkGLcall (   A)
Value:
do \
{ \
if (__WINE_IS_DEBUG_ON(_ERR, &__wine_dbch_d3d) \
&& !gl_info->supported[ARB_DEBUG_OUTPUT]) \
wined3d_check_gl_call(gl_info, __FILE__, __LINE__, A); \
} while(0)
Definition: ehthrow.cxx:93
#define __WINE_IS_DEBUG_ON(dbcl, dbch)
Definition: debug.h:89
@ ARB_DEBUG_OUTPUT
Definition: wined3d_gl.h:65

Definition at line 402 of file wined3d_gl.h.

◆ GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI

#define GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI   0x8837 /* not in the gl spec */

Definition at line 38 of file wined3d_gl.h.

◆ GL_EXTCALL

#define GL_EXTCALL (   f)    (gl_info->gl_ops.ext.p_##f)

Definition at line 360 of file wined3d_gl.h.

◆ MAX_GL_FRAGMENT_SAMPLERS

#define MAX_GL_FRAGMENT_SAMPLERS   32

Definition at line 573 of file wined3d_gl.h.

◆ WINE_GLAPI

#define WINE_GLAPI   __stdcall

Definition at line 27 of file wined3d_gl.h.

◆ WINED3D_FBO_ENTRY_FLAG_ATTACHED

#define WINED3D_FBO_ENTRY_FLAG_ATTACHED   0x1

Definition at line 582 of file wined3d_gl.h.

◆ WINED3D_FBO_ENTRY_FLAG_DEPTH

#define WINED3D_FBO_ENTRY_FLAG_DEPTH   0x2

Definition at line 583 of file wined3d_gl.h.

◆ WINED3D_FBO_ENTRY_FLAG_STENCIL

#define WINED3D_FBO_ENTRY_FLAG_STENCIL   0x4

Definition at line 584 of file wined3d_gl.h.

◆ WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA

#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA   0x00000008

Definition at line 324 of file wined3d_gl.h.

◆ WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT

#define WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT   0x00000001

Definition at line 322 of file wined3d_gl.h.

◆ WINED3D_QUIRK_BROKEN_ARB_FOG

#define WINED3D_QUIRK_BROKEN_ARB_FOG   0x00000200

Definition at line 330 of file wined3d_gl.h.

◆ WINED3D_QUIRK_BROKEN_RGBA16

#define WINED3D_QUIRK_BROKEN_RGBA16   0x00000040

Definition at line 327 of file wined3d_gl.h.

◆ WINED3D_QUIRK_FBO_TEX_UPDATE

#define WINED3D_QUIRK_FBO_TEX_UPDATE   0x00000020

Definition at line 326 of file wined3d_gl.h.

◆ WINED3D_QUIRK_GLSL_CLIP_VARYING

#define WINED3D_QUIRK_GLSL_CLIP_VARYING   0x00000004

Definition at line 323 of file wined3d_gl.h.

◆ WINED3D_QUIRK_INFO_LOG_SPAM

#define WINED3D_QUIRK_INFO_LOG_SPAM   0x00000080

Definition at line 328 of file wined3d_gl.h.

◆ WINED3D_QUIRK_LIMITED_TEX_FILTERING

#define WINED3D_QUIRK_LIMITED_TEX_FILTERING   0x00000100

Definition at line 329 of file wined3d_gl.h.

◆ WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS

#define WINED3D_QUIRK_NO_INDEPENDENT_BIT_DEPTHS   0x00000400

Definition at line 331 of file wined3d_gl.h.

◆ WINED3D_QUIRK_NV_CLIP_BROKEN

#define WINED3D_QUIRK_NV_CLIP_BROKEN   0x00000010

Definition at line 325 of file wined3d_gl.h.

Typedef Documentation

◆ wined3d_generic_attrib_func

typedef void(WINE_GLAPI * wined3d_generic_attrib_func) (GLuint idx, const void *data)

Definition at line 333 of file wined3d_gl.h.

Enumeration Type Documentation

◆ wined3d_fence_result

Enumerator
WINED3D_FENCE_OK 
WINED3D_FENCE_WAITING 
WINED3D_FENCE_NOT_STARTED 
WINED3D_FENCE_WRONG_THREAD 
WINED3D_FENCE_ERROR 

Definition at line 445 of file wined3d_gl.h.

446{
452};
@ WINED3D_FENCE_WRONG_THREAD
Definition: wined3d_gl.h:450
@ WINED3D_FENCE_OK
Definition: wined3d_gl.h:447
@ WINED3D_FENCE_WAITING
Definition: wined3d_gl.h:448
@ WINED3D_FENCE_ERROR
Definition: wined3d_gl.h:451
@ WINED3D_FENCE_NOT_STARTED
Definition: wined3d_gl.h:449

◆ wined3d_gl_extension

Enumerator
WINED3D_GL_EXT_NONE 
APPLE_FENCE 
APPLE_FLOAT_PIXELS 
APPLE_FLUSH_BUFFER_RANGE 
APPLE_FLUSH_RENDER 
APPLE_RGB_422 
APPLE_YCBCR_422 
ARB_BASE_INSTANCE 
ARB_BLEND_FUNC_EXTENDED 
ARB_BUFFER_STORAGE 
ARB_CLEAR_BUFFER_OBJECT 
ARB_CLEAR_TEXTURE 
ARB_CLIP_CONTROL 
ARB_COLOR_BUFFER_FLOAT 
ARB_COMPUTE_SHADER 
ARB_CONSERVATIVE_DEPTH 
ARB_COPY_BUFFER 
ARB_COPY_IMAGE 
ARB_CULL_DISTANCE 
ARB_DEBUG_OUTPUT 
ARB_DEPTH_BUFFER_FLOAT 
ARB_DEPTH_CLAMP 
ARB_DEPTH_TEXTURE 
ARB_DERIVATIVE_CONTROL 
ARB_DRAW_BUFFERS 
ARB_DRAW_BUFFERS_BLEND 
ARB_DRAW_ELEMENTS_BASE_VERTEX 
ARB_DRAW_INDIRECT 
ARB_DRAW_INSTANCED 
ARB_ES2_COMPATIBILITY 
ARB_ES3_COMPATIBILITY 
ARB_EXPLICIT_ATTRIB_LOCATION 
ARB_FRAGMENT_COORD_CONVENTIONS 
ARB_FRAGMENT_LAYER_VIEWPORT 
ARB_FRAGMENT_PROGRAM 
ARB_FRAGMENT_PROGRAM_SHADOW 
ARB_FRAGMENT_SHADER 
ARB_FRAMEBUFFER_NO_ATTACHMENTS 
ARB_FRAMEBUFFER_OBJECT 
ARB_FRAMEBUFFER_SRGB 
ARB_GEOMETRY_SHADER4 
ARB_GPU_SHADER5 
ARB_HALF_FLOAT_PIXEL 
ARB_HALF_FLOAT_VERTEX 
ARB_INSTANCED_ARRAYS 
ARB_INTERNALFORMAT_QUERY 
ARB_INTERNALFORMAT_QUERY2 
ARB_MAP_BUFFER_ALIGNMENT 
ARB_MAP_BUFFER_RANGE 
ARB_MULTISAMPLE 
ARB_MULTITEXTURE 
ARB_OCCLUSION_QUERY 
ARB_PIPELINE_STATISTICS_QUERY 
ARB_PIXEL_BUFFER_OBJECT 
ARB_POINT_PARAMETERS 
ARB_POINT_SPRITE 
ARB_POLYGON_OFFSET_CLAMP 
ARB_PROVOKING_VERTEX 
ARB_QUERY_BUFFER_OBJECT 
ARB_SAMPLE_SHADING 
ARB_SAMPLER_OBJECTS 
ARB_SEAMLESS_CUBE_MAP 
ARB_SHADER_ATOMIC_COUNTERS 
ARB_SHADER_VIEWPORT_LAYER_ARRAY 
ARB_SHADER_BIT_ENCODING 
ARB_SHADER_IMAGE_LOAD_STORE 
ARB_SHADER_IMAGE_SIZE 
ARB_SHADER_STENCIL_EXPORT 
ARB_SHADER_STORAGE_BUFFER_OBJECT 
ARB_SHADER_TEXTURE_IMAGE_SAMPLES 
ARB_SHADER_TEXTURE_LOD 
ARB_SHADING_LANGUAGE_100 
ARB_SHADING_LANGUAGE_420PACK 
ARB_SHADING_LANGUAGE_PACKING 
ARB_SHADOW 
ARB_STENCIL_TEXTURING 
ARB_SYNC 
ARB_TESSELLATION_SHADER 
ARB_TEXTURE_BORDER_CLAMP 
ARB_TEXTURE_BUFFER_OBJECT 
ARB_TEXTURE_BUFFER_RANGE 
ARB_TEXTURE_COMPRESSION 
ARB_TEXTURE_COMPRESSION_BPTC 
ARB_TEXTURE_COMPRESSION_RGTC 
ARB_TEXTURE_CUBE_MAP 
ARB_TEXTURE_CUBE_MAP_ARRAY 
ARB_TEXTURE_ENV_COMBINE 
ARB_TEXTURE_ENV_DOT3 
ARB_TEXTURE_FILTER_ANISOTROPIC 
ARB_TEXTURE_FLOAT 
ARB_TEXTURE_GATHER 
ARB_TEXTURE_MIRRORED_REPEAT 
ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE 
ARB_TEXTURE_MULTISAMPLE 
ARB_TEXTURE_NON_POWER_OF_TWO 
ARB_TEXTURE_QUERY_LEVELS 
ARB_TEXTURE_RG 
ARB_TEXTURE_RGB10_A2UI 
ARB_TEXTURE_STORAGE 
ARB_TEXTURE_STORAGE_MULTISAMPLE 
ARB_TEXTURE_SWIZZLE 
ARB_TEXTURE_VIEW 
ARB_TIMER_QUERY 
ARB_TRANSFORM_FEEDBACK2 
ARB_TRANSFORM_FEEDBACK3 
ARB_UNIFORM_BUFFER_OBJECT 
ARB_VERTEX_ARRAY_BGRA 
ARB_VERTEX_BUFFER_OBJECT 
ARB_VERTEX_PROGRAM 
ARB_VERTEX_SHADER 
ARB_VERTEX_TYPE_10F_11F_11F_REV 
ARB_VERTEX_TYPE_2_10_10_10_REV 
ARB_VIEWPORT_ARRAY 
ARB_TEXTURE_BARRIER 
ATI_FRAGMENT_SHADER 
ATI_SEPARATE_STENCIL 
ATI_TEXTURE_COMPRESSION_3DC 
ATI_TEXTURE_ENV_COMBINE3 
ATI_TEXTURE_MIRROR_ONCE 
EXT_BLEND_COLOR 
EXT_BLEND_EQUATION_SEPARATE 
EXT_BLEND_FUNC_SEPARATE 
EXT_BLEND_MINMAX 
EXT_BLEND_SUBTRACT 
EXT_DEPTH_BOUNDS_TEST 
EXT_DRAW_BUFFERS2 
EXT_FOG_COORD 
EXT_FRAMEBUFFER_BLIT 
EXT_FRAMEBUFFER_MULTISAMPLE 
EXT_FRAMEBUFFER_MULTISAMPLE_BLIT_SCALED 
EXT_FRAMEBUFFER_OBJECT 
EXT_GPU_PROGRAM_PARAMETERS 
EXT_GPU_SHADER4 
EXT_MEMORY_OBJECT 
EXT_PACKED_DEPTH_STENCIL 
EXT_PACKED_FLOAT 
EXT_POINT_PARAMETERS 
EXT_PROVOKING_VERTEX 
EXT_SECONDARY_COLOR 
EXT_SHADER_INTEGER_MIX 
EXT_STENCIL_TWO_SIDE 
EXT_STENCIL_WRAP 
EXT_TEXTURE3D 
EXT_TEXTURE_ARRAY 
EXT_TEXTURE_COMPRESSION_RGTC 
EXT_TEXTURE_COMPRESSION_S3TC 
EXT_TEXTURE_ENV_COMBINE 
EXT_TEXTURE_ENV_DOT3 
EXT_TEXTURE_INTEGER 
EXT_TEXTURE_LOD_BIAS 
EXT_TEXTURE_MIRROR_CLAMP 
EXT_TEXTURE_SHADOW_LOD 
EXT_TEXTURE_SHARED_EXPONENT 
EXT_TEXTURE_SNORM 
EXT_TEXTURE_SRGB 
EXT_TEXTURE_SRGB_DECODE 
NV_FENCE 
NV_FOG_DISTANCE 
NV_FRAGMENT_PROGRAM 
NV_FRAGMENT_PROGRAM2 
NV_FRAGMENT_PROGRAM_OPTION 
NV_HALF_FLOAT 
NV_LIGHT_MAX_EXPONENT 
NV_POINT_SPRITE 
NV_REGISTER_COMBINERS 
NV_REGISTER_COMBINERS2 
NV_TEXGEN_REFLECTION 
NV_TEXTURE_ENV_COMBINE4 
NV_TEXTURE_SHADER 
NV_TEXTURE_SHADER2 
NV_VERTEX_PROGRAM 
NV_VERTEX_PROGRAM1_1 
NV_VERTEX_PROGRAM2 
NV_VERTEX_PROGRAM2_OPTION 
NV_VERTEX_PROGRAM3 
NV_TEXTURE_BARRIER 
WGL_ARB_PIXEL_FORMAT 
WGL_EXT_SWAP_CONTROL 
WGL_WINE_PIXEL_FORMAT_PASSTHROUGH 
WGL_WINE_QUERY_RENDERER 
WINED3D_GL_BLEND_EQUATION 
WINED3D_GL_LEGACY_CONTEXT 
WINED3D_GL_NORMALIZED_TEXRECT 
WINED3D_GL_PRIMITIVE_QUERY 
WINED3D_GL_VERSION_2_0 
WINED3D_GL_VERSION_3_2 
WINED3D_GLSL_130 
WINED3D_GL_EXT_COUNT 

Definition at line 41 of file wined3d_gl.h.

42{
44
45 /* APPLE */
52 /* ARB */
122 ARB_SYNC,
160 /* ATI */
166 /* EXT */
204 /* NVIDIA */
205 NV_FENCE,
225 /* WGL extensions */
230 /* Internally used */
238
240};
@ EXT_STENCIL_TWO_SIDE
Definition: wined3d_gl.h:188
@ ARB_GPU_SHADER5
Definition: wined3d_gl.h:87
@ EXT_BLEND_EQUATION_SEPARATE
Definition: wined3d_gl.h:168
@ NV_VERTEX_PROGRAM3
Definition: wined3d_gl.h:223
@ ARB_FRAGMENT_PROGRAM_SHADOW
Definition: wined3d_gl.h:81
@ ARB_EXPLICIT_ATTRIB_LOCATION
Definition: wined3d_gl.h:77
@ ARB_SHADING_LANGUAGE_PACKING
Definition: wined3d_gl.h:119
@ NV_FRAGMENT_PROGRAM2
Definition: wined3d_gl.h:208
@ ARB_TEXTURE_QUERY_LEVELS
Definition: wined3d_gl.h:141
@ ARB_TEXTURE_FILTER_ANISOTROPIC
Definition: wined3d_gl.h:134
@ NV_HALF_FLOAT
Definition: wined3d_gl.h:210
@ NV_POINT_SPRITE
Definition: wined3d_gl.h:212
@ ARB_TEXTURE_BUFFER_OBJECT
Definition: wined3d_gl.h:125
@ NV_TEXTURE_SHADER2
Definition: wined3d_gl.h:218
@ ARB_TEXTURE_CUBE_MAP
Definition: wined3d_gl.h:130
@ ATI_FRAGMENT_SHADER
Definition: wined3d_gl.h:161
@ ARB_INTERNALFORMAT_QUERY
Definition: wined3d_gl.h:91
@ EXT_SECONDARY_COLOR
Definition: wined3d_gl.h:186
@ ATI_SEPARATE_STENCIL
Definition: wined3d_gl.h:162
@ ARB_CULL_DISTANCE
Definition: wined3d_gl.h:64
@ ARB_DERIVATIVE_CONTROL
Definition: wined3d_gl.h:69
@ ARB_SEAMLESS_CUBE_MAP
Definition: wined3d_gl.h:107
@ ARB_PIPELINE_STATISTICS_QUERY
Definition: wined3d_gl.h:98
@ EXT_BLEND_MINMAX
Definition: wined3d_gl.h:170
@ ARB_SHADER_BIT_ENCODING
Definition: wined3d_gl.h:110
@ WINED3D_GL_EXT_NONE
Definition: wined3d_gl.h:43
@ ARB_POINT_PARAMETERS
Definition: wined3d_gl.h:100
@ ARB_CLEAR_TEXTURE
Definition: wined3d_gl.h:57
@ ARB_FRAGMENT_PROGRAM
Definition: wined3d_gl.h:80
@ ARB_SHADER_IMAGE_SIZE
Definition: wined3d_gl.h:112
@ ARB_DEPTH_TEXTURE
Definition: wined3d_gl.h:68
@ EXT_TEXTURE_SHARED_EXPONENT
Definition: wined3d_gl.h:200
@ WGL_EXT_SWAP_CONTROL
Definition: wined3d_gl.h:227
@ ARB_DRAW_ELEMENTS_BASE_VERTEX
Definition: wined3d_gl.h:72
@ ARB_TEXTURE_BARRIER
Definition: wined3d_gl.h:159
@ ARB_COMPUTE_SHADER
Definition: wined3d_gl.h:60
@ ARB_PROVOKING_VERTEX
Definition: wined3d_gl.h:103
@ WINED3D_GL_PRIMITIVE_QUERY
Definition: wined3d_gl.h:234
@ NV_TEXGEN_REFLECTION
Definition: wined3d_gl.h:215
@ ARB_FRAGMENT_LAYER_VIEWPORT
Definition: wined3d_gl.h:79
@ EXT_FOG_COORD
Definition: wined3d_gl.h:174
@ WINED3D_GL_BLEND_EQUATION
Definition: wined3d_gl.h:231
@ APPLE_FENCE
Definition: wined3d_gl.h:46
@ EXT_MEMORY_OBJECT
Definition: wined3d_gl.h:181
@ WGL_WINE_QUERY_RENDERER
Definition: wined3d_gl.h:229
@ ARB_TEXTURE_VIEW
Definition: wined3d_gl.h:147
@ APPLE_FLUSH_BUFFER_RANGE
Definition: wined3d_gl.h:48
@ ARB_CONSERVATIVE_DEPTH
Definition: wined3d_gl.h:61
@ ARB_SHADER_STORAGE_BUFFER_OBJECT
Definition: wined3d_gl.h:114
@ ARB_TEXTURE_ENV_COMBINE
Definition: wined3d_gl.h:132
@ EXT_STENCIL_WRAP
Definition: wined3d_gl.h:189
@ WGL_WINE_PIXEL_FORMAT_PASSTHROUGH
Definition: wined3d_gl.h:228
@ ATI_TEXTURE_COMPRESSION_3DC
Definition: wined3d_gl.h:163
@ ARB_VERTEX_PROGRAM
Definition: wined3d_gl.h:154
@ EXT_FRAMEBUFFER_MULTISAMPLE_BLIT_SCALED
Definition: wined3d_gl.h:177
@ ARB_TEXTURE_COMPRESSION_RGTC
Definition: wined3d_gl.h:129
@ ARB_TEXTURE_MIRRORED_REPEAT
Definition: wined3d_gl.h:137
@ WGL_ARB_PIXEL_FORMAT
Definition: wined3d_gl.h:226
@ EXT_TEXTURE_SRGB_DECODE
Definition: wined3d_gl.h:203
@ ARB_SAMPLER_OBJECTS
Definition: wined3d_gl.h:106
@ ARB_VERTEX_BUFFER_OBJECT
Definition: wined3d_gl.h:153
@ EXT_TEXTURE_INTEGER
Definition: wined3d_gl.h:196
@ ARB_ES2_COMPATIBILITY
Definition: wined3d_gl.h:75
@ ARB_MULTISAMPLE
Definition: wined3d_gl.h:95
@ ARB_BUFFER_STORAGE
Definition: wined3d_gl.h:55
@ ARB_TEXTURE_FLOAT
Definition: wined3d_gl.h:135
@ ARB_FRAMEBUFFER_OBJECT
Definition: wined3d_gl.h:84
@ ARB_VERTEX_SHADER
Definition: wined3d_gl.h:155
@ ARB_POLYGON_OFFSET_CLAMP
Definition: wined3d_gl.h:102
@ EXT_TEXTURE3D
Definition: wined3d_gl.h:190
@ ARB_TEXTURE_BORDER_CLAMP
Definition: wined3d_gl.h:124
@ WINED3D_GL_VERSION_3_2
Definition: wined3d_gl.h:236
@ EXT_TEXTURE_LOD_BIAS
Definition: wined3d_gl.h:197
@ ARB_DRAW_INDIRECT
Definition: wined3d_gl.h:73
@ ARB_TEXTURE_RG
Definition: wined3d_gl.h:142
@ ARB_TEXTURE_MULTISAMPLE
Definition: wined3d_gl.h:139
@ ARB_TEXTURE_RGB10_A2UI
Definition: wined3d_gl.h:143
@ ARB_INTERNALFORMAT_QUERY2
Definition: wined3d_gl.h:92
@ EXT_GPU_SHADER4
Definition: wined3d_gl.h:180
@ ARB_BASE_INSTANCE
Definition: wined3d_gl.h:53
@ ARB_HALF_FLOAT_VERTEX
Definition: wined3d_gl.h:89
@ ARB_ES3_COMPATIBILITY
Definition: wined3d_gl.h:76
@ ARB_INSTANCED_ARRAYS
Definition: wined3d_gl.h:90
@ ARB_DEPTH_CLAMP
Definition: wined3d_gl.h:67
@ EXT_BLEND_FUNC_SEPARATE
Definition: wined3d_gl.h:169
@ NV_FRAGMENT_PROGRAM
Definition: wined3d_gl.h:207
@ EXT_PACKED_FLOAT
Definition: wined3d_gl.h:183
@ NV_REGISTER_COMBINERS2
Definition: wined3d_gl.h:214
@ NV_TEXTURE_ENV_COMBINE4
Definition: wined3d_gl.h:216
@ ARB_MAP_BUFFER_ALIGNMENT
Definition: wined3d_gl.h:93
@ ARB_FRAMEBUFFER_SRGB
Definition: wined3d_gl.h:85
@ ARB_SHADER_TEXTURE_IMAGE_SAMPLES
Definition: wined3d_gl.h:115
@ ARB_FRAGMENT_COORD_CONVENTIONS
Definition: wined3d_gl.h:78
@ ARB_UNIFORM_BUFFER_OBJECT
Definition: wined3d_gl.h:151
@ WINED3D_GL_NORMALIZED_TEXRECT
Definition: wined3d_gl.h:233
@ ARB_CLEAR_BUFFER_OBJECT
Definition: wined3d_gl.h:56
@ EXT_PACKED_DEPTH_STENCIL
Definition: wined3d_gl.h:182
@ ATI_TEXTURE_ENV_COMBINE3
Definition: wined3d_gl.h:164
@ ARB_SYNC
Definition: wined3d_gl.h:122
@ NV_FENCE
Definition: wined3d_gl.h:205
@ NV_VERTEX_PROGRAM
Definition: wined3d_gl.h:219
@ NV_FRAGMENT_PROGRAM_OPTION
Definition: wined3d_gl.h:209
@ NV_LIGHT_MAX_EXPONENT
Definition: wined3d_gl.h:211
@ EXT_TEXTURE_SRGB
Definition: wined3d_gl.h:202
@ ARB_FRAMEBUFFER_NO_ATTACHMENTS
Definition: wined3d_gl.h:83
@ EXT_TEXTURE_SHADOW_LOD
Definition: wined3d_gl.h:199
@ EXT_TEXTURE_ENV_DOT3
Definition: wined3d_gl.h:195
@ ARB_SHADOW
Definition: wined3d_gl.h:120
@ ARB_SHADING_LANGUAGE_100
Definition: wined3d_gl.h:117
@ APPLE_FLOAT_PIXELS
Definition: wined3d_gl.h:47
@ EXT_TEXTURE_COMPRESSION_RGTC
Definition: wined3d_gl.h:192
@ EXT_POINT_PARAMETERS
Definition: wined3d_gl.h:184
@ WINED3D_GLSL_130
Definition: wined3d_gl.h:237
@ EXT_TEXTURE_MIRROR_CLAMP
Definition: wined3d_gl.h:198
@ NV_VERTEX_PROGRAM1_1
Definition: wined3d_gl.h:220
@ ARB_SHADER_TEXTURE_LOD
Definition: wined3d_gl.h:116
@ EXT_BLEND_COLOR
Definition: wined3d_gl.h:167
@ ARB_FRAGMENT_SHADER
Definition: wined3d_gl.h:82
@ ARB_BLEND_FUNC_EXTENDED
Definition: wined3d_gl.h:54
@ ARB_TEXTURE_STORAGE
Definition: wined3d_gl.h:144
@ ARB_SHADER_ATOMIC_COUNTERS
Definition: wined3d_gl.h:108
@ EXT_FRAMEBUFFER_MULTISAMPLE
Definition: wined3d_gl.h:176
@ ARB_VERTEX_ARRAY_BGRA
Definition: wined3d_gl.h:152
@ NV_TEXTURE_BARRIER
Definition: wined3d_gl.h:224
@ ARB_TEXTURE_MIRROR_CLAMP_TO_EDGE
Definition: wined3d_gl.h:138
@ ARB_SHADING_LANGUAGE_420PACK
Definition: wined3d_gl.h:118
@ ARB_TESSELLATION_SHADER
Definition: wined3d_gl.h:123
@ ARB_GEOMETRY_SHADER4
Definition: wined3d_gl.h:86
@ EXT_BLEND_SUBTRACT
Definition: wined3d_gl.h:171
@ ATI_TEXTURE_MIRROR_ONCE
Definition: wined3d_gl.h:165
@ EXT_SHADER_INTEGER_MIX
Definition: wined3d_gl.h:187
@ EXT_DEPTH_BOUNDS_TEST
Definition: wined3d_gl.h:172
@ ARB_VERTEX_TYPE_2_10_10_10_REV
Definition: wined3d_gl.h:157
@ ARB_DRAW_BUFFERS
Definition: wined3d_gl.h:70
@ ARB_HALF_FLOAT_PIXEL
Definition: wined3d_gl.h:88
@ ARB_COLOR_BUFFER_FLOAT
Definition: wined3d_gl.h:59
@ ARB_SAMPLE_SHADING
Definition: wined3d_gl.h:105
@ ARB_DRAW_INSTANCED
Definition: wined3d_gl.h:74
@ APPLE_YCBCR_422
Definition: wined3d_gl.h:51
@ ARB_TRANSFORM_FEEDBACK3
Definition: wined3d_gl.h:150
@ ARB_TEXTURE_GATHER
Definition: wined3d_gl.h:136
@ NV_TEXTURE_SHADER
Definition: wined3d_gl.h:217
@ ARB_VIEWPORT_ARRAY
Definition: wined3d_gl.h:158
@ ARB_TEXTURE_NON_POWER_OF_TWO
Definition: wined3d_gl.h:140
@ WINED3D_GL_LEGACY_CONTEXT
Definition: wined3d_gl.h:232
@ EXT_FRAMEBUFFER_OBJECT
Definition: wined3d_gl.h:178
@ NV_REGISTER_COMBINERS
Definition: wined3d_gl.h:213
@ WINED3D_GL_VERSION_2_0
Definition: wined3d_gl.h:235
@ ARB_MAP_BUFFER_RANGE
Definition: wined3d_gl.h:94
@ EXT_FRAMEBUFFER_BLIT
Definition: wined3d_gl.h:175
@ ARB_COPY_IMAGE
Definition: wined3d_gl.h:63
@ NV_VERTEX_PROGRAM2_OPTION
Definition: wined3d_gl.h:222
@ APPLE_RGB_422
Definition: wined3d_gl.h:50
@ ARB_SHADER_STENCIL_EXPORT
Definition: wined3d_gl.h:113
@ ARB_CLIP_CONTROL
Definition: wined3d_gl.h:58
@ ARB_TEXTURE_SWIZZLE
Definition: wined3d_gl.h:146
@ EXT_GPU_PROGRAM_PARAMETERS
Definition: wined3d_gl.h:179
@ ARB_SHADER_IMAGE_LOAD_STORE
Definition: wined3d_gl.h:111
@ ARB_TEXTURE_COMPRESSION_BPTC
Definition: wined3d_gl.h:128
@ ARB_OCCLUSION_QUERY
Definition: wined3d_gl.h:97
@ ARB_TEXTURE_COMPRESSION
Definition: wined3d_gl.h:127
@ ARB_TEXTURE_ENV_DOT3
Definition: wined3d_gl.h:133
@ ARB_POINT_SPRITE
Definition: wined3d_gl.h:101
@ WINED3D_GL_EXT_COUNT
Definition: wined3d_gl.h:239
@ ARB_SHADER_VIEWPORT_LAYER_ARRAY
Definition: wined3d_gl.h:109
@ ARB_STENCIL_TEXTURING
Definition: wined3d_gl.h:121
@ EXT_TEXTURE_ARRAY
Definition: wined3d_gl.h:191
@ NV_FOG_DISTANCE
Definition: wined3d_gl.h:206
@ EXT_TEXTURE_COMPRESSION_S3TC
Definition: wined3d_gl.h:193
@ ARB_TEXTURE_BUFFER_RANGE
Definition: wined3d_gl.h:126
@ ARB_MULTITEXTURE
Definition: wined3d_gl.h:96
@ EXT_TEXTURE_SNORM
Definition: wined3d_gl.h:201
@ ARB_PIXEL_BUFFER_OBJECT
Definition: wined3d_gl.h:99
@ ARB_QUERY_BUFFER_OBJECT
Definition: wined3d_gl.h:104
@ ARB_TRANSFORM_FEEDBACK2
Definition: wined3d_gl.h:149
@ ARB_VERTEX_TYPE_10F_11F_11F_REV
Definition: wined3d_gl.h:156
@ EXT_DRAW_BUFFERS2
Definition: wined3d_gl.h:173
@ APPLE_FLUSH_RENDER
Definition: wined3d_gl.h:49
@ ARB_DRAW_BUFFERS_BLEND
Definition: wined3d_gl.h:71
@ ARB_TIMER_QUERY
Definition: wined3d_gl.h:148
@ EXT_PROVOKING_VERTEX
Definition: wined3d_gl.h:185
@ ARB_TEXTURE_STORAGE_MULTISAMPLE
Definition: wined3d_gl.h:145
@ EXT_TEXTURE_ENV_COMBINE
Definition: wined3d_gl.h:194
@ ARB_TEXTURE_CUBE_MAP_ARRAY
Definition: wined3d_gl.h:131
@ ARB_DEPTH_BUFFER_FLOAT
Definition: wined3d_gl.h:66
@ ARB_COPY_BUFFER
Definition: wined3d_gl.h:62
@ NV_VERTEX_PROGRAM2
Definition: wined3d_gl.h:221

Function Documentation

◆ context_create_wgl_attribs()

HGLRC context_create_wgl_attribs ( const struct wined3d_gl_info *  gl_info,
HDC  hdc,
HGLRC  share_ctx 
)

Definition at line 1881 of file context_gl.c.

1882{
1883 HGLRC ctx;
1884 unsigned int ctx_attrib_idx = 0;
1885 GLint ctx_attribs[7], ctx_flags = 0;
1886
1887 if (context_debug_output_enabled(gl_info))
1888 ctx_flags = WGL_CONTEXT_DEBUG_BIT_ARB;
1889 ctx_attribs[ctx_attrib_idx++] = WGL_CONTEXT_MAJOR_VERSION_ARB;
1890 ctx_attribs[ctx_attrib_idx++] = gl_info->selected_gl_version >> 16;
1891 ctx_attribs[ctx_attrib_idx++] = WGL_CONTEXT_MINOR_VERSION_ARB;
1892 ctx_attribs[ctx_attrib_idx++] = gl_info->selected_gl_version & 0xffff;
1893 if (ctx_flags)
1894 {
1895 ctx_attribs[ctx_attrib_idx++] = WGL_CONTEXT_FLAGS_ARB;
1896 ctx_attribs[ctx_attrib_idx++] = ctx_flags;
1897 }
1898 ctx_attribs[ctx_attrib_idx] = 0;
1899
1900 if (!(ctx = gl_info->p_wglCreateContextAttribsARB(hdc, share_ctx, ctx_attribs)))
1901 {
1902 if (gl_info->selected_gl_version >= MAKEDWORD_VERSION(3, 2))
1903 {
1904 if (ctx_flags)
1905 {
1907 ctx_attribs[ctx_attrib_idx - 1] = ctx_flags;
1908 }
1909 else
1910 {
1912 ctx_attribs[ctx_attrib_idx++] = WGL_CONTEXT_FLAGS_ARB;
1913 ctx_attribs[ctx_attrib_idx++] = ctx_flags;
1914 ctx_attribs[ctx_attrib_idx] = 0;
1915 }
1916 if (!(ctx = gl_info->p_wglCreateContextAttribsARB(hdc, share_ctx, ctx_attribs)))
1917 WARN("Failed to create a WGL context with wglCreateContextAttribsARB, last error %#lx.\n",
1918 GetLastError());
1919 }
1920 }
1921 return ctx;
1922}
#define WARN(fmt,...)
Definition: precomp.h:61
static BOOL context_debug_output_enabled(const struct wined3d_gl_info *gl_info)
Definition: context_gl.c:1850
int GLint
Definition: gl.h:156
HDC hdc
Definition: main.c:9
static HGLRC(WINAPI *pwglCreateContextAttribsARB)(HDC hDC
unsigned int selected_gl_version
Definition: wined3d_gl.h:342
#define WGL_CONTEXT_MINOR_VERSION_ARB
Definition: wgl.h:5140
#define WGL_CONTEXT_MAJOR_VERSION_ARB
Definition: wgl.h:5139
#define WGL_CONTEXT_DEBUG_BIT_ARB
Definition: wgl.h:5134
#define WGL_CONTEXT_FLAGS_ARB
Definition: wgl.h:5136
#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB
Definition: wgl.h:5137
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define MAKEDWORD_VERSION(maj, min)

Referenced by wined3d_caps_gl_ctx_create_attribs(), and wined3d_context_gl_create_wgl_ctx().

◆ context_get_tls_idx()

DWORD context_get_tls_idx ( void  )

Definition at line 1556 of file context_gl.c.

1557{
1559}
static DWORD wined3d_context_tls_idx
Definition: context_gl.c:37

Referenced by wined3d_context_gl_destroy(), and wined3d_dll_destroy().

◆ context_gl_apply_texture_draw_state()

void context_gl_apply_texture_draw_state ( struct wined3d_context_gl *  context_gl,
struct wined3d_texture *  texture,
unsigned int  sub_resource_idx,
unsigned int  location 
)

Definition at line 3384 of file context_gl.c.

3386{
3387 const struct wined3d_format *format = texture->resource.format;
3388 struct wined3d_context *context = &context_gl->c;
3389 uint32_t rt_mask, *cur_mask;
3390
3391 TRACE("context_gl %p, texture %p, sub_resource_idx %u, location %s.\n",
3393
3394 if (format->depth_size || format->stencil_size)
3396 0, &texture->resource, sub_resource_idx, location);
3397 else
3400
3402 {
3403 if (texture->resource.format->id == WINED3DFMT_NULL || format->depth_size || format->stencil_size)
3404 rt_mask = 0;
3405 else
3406 rt_mask = 1;
3407 }
3408 else
3409 {
3410 rt_mask = context_generate_rt_mask_from_resource(&texture->resource);
3411 }
3412
3413 cur_mask = context_gl->current_fbo ? &context_gl->current_fbo->rt_mask : &context_gl->draw_buffers_mask;
3414 if (rt_mask != *cur_mask)
3415 {
3416 wined3d_context_gl_apply_draw_buffers(context_gl, rt_mask);
3417 *cur_mask = rt_mask;
3418 }
3419
3421
3423}
static void wined3d_context_gl_apply_draw_buffers(struct wined3d_context_gl *context_gl, uint32_t rt_mask)
Definition: context_gl.c:2447
void wined3d_context_gl_check_fbo_status(const struct wined3d_context_gl *context_gl, GLenum target)
Definition: context_gl.c:419
void wined3d_context_gl_apply_fbo_state_explicit(struct wined3d_context_gl *context_gl, GLenum target, struct wined3d_resource *rt, unsigned int rt_sub_resource_idx, struct wined3d_resource *ds, unsigned int ds_sub_resource_idx, uint32_t location)
Definition: context_gl.c:852
static DWORD context_generate_rt_mask_from_resource(struct wined3d_resource *resource)
Definition: context_gl.c:458
#define NULL
Definition: types.h:112
UINT32 uint32_t
Definition: types.h:75
void context_invalidate_state(struct wined3d_context *context, unsigned int state_id)
Definition: context.c:76
const char * wined3d_debug_location(uint32_t location)
Definition: utils.c:6588
GLenum GLuint texture
Definition: glext.h:6295
#define GL_DRAW_FRAMEBUFFER
Definition: glext.h:1699
#define TRACE(s)
Definition: solgame.cpp:4
Definition: http.c:7252
struct fbo_entry * current_fbo
Definition: wined3d_gl.h:641
struct wined3d_context c
Definition: wined3d_gl.h:601
uint32_t draw_buffers_mask
Definition: wined3d_gl.h:645
unsigned int sub_resource_idx
@ WINED3DFMT_NULL
Definition: wined3d.h:276
#define WINED3D_LOCATION_DRAWABLE
#define STATE_FRAMEBUFFER

Referenced by glsl_blitter_blit(), texture2d_blt_fbo(), texture2d_depth_blt_fbo(), and wined3d_texture_gl_clear().

◆ context_gl_resource_released()

void context_gl_resource_released ( struct wined3d_device *  device,
GLuint  name,
BOOL  rb_namespace 
)

Definition at line 1137 of file context_gl.c.

1138{
1141}
static void wined3d_context_gl_enum_fbo_entries(const struct wined3d_device *device, GLuint name, BOOL rb_namespace, context_fbo_entry_func_t *callback)
Definition: context_gl.c:1104
static void wined3d_context_gl_queue_fbo_entry_destruction(struct wined3d_context_gl *context_gl, struct fbo_entry *entry)
Definition: context_gl.c:1130
Definition: devices.h:37
Definition: name.c:39

Referenced by gltexture_delete(), wined3d_texture_gl_unload_location(), and wined3d_view_gl_destroy_object().

◆ debug_fboattachment()

const char * debug_fboattachment ( GLenum  attachment)

Definition at line 5394 of file utils.c.

5395{
5396 switch(attachment)
5397 {
5398#define WINED3D_TO_STR(x) case x: return #x
5417#undef WINED3D_TO_STR
5418 default:
5419 return wine_dbg_sprintf("Unknown FBO attachment %#x", attachment);
5420 }
5421}
#define WINED3D_TO_STR(x)
const char * wine_dbg_sprintf(const char *format,...)
Definition: compat.c:296
#define GL_COLOR_ATTACHMENT5
Definition: glext.h:1719
#define GL_COLOR_ATTACHMENT13
Definition: glext.h:1727
#define GL_COLOR_ATTACHMENT7
Definition: glext.h:1721
#define GL_COLOR_ATTACHMENT9
Definition: glext.h:1723
#define GL_COLOR_ATTACHMENT0
Definition: glext.h:1714
#define GL_COLOR_ATTACHMENT11
Definition: glext.h:1725
#define GL_COLOR_ATTACHMENT2
Definition: glext.h:1716
#define GL_COLOR_ATTACHMENT1
Definition: glext.h:1715
#define GL_COLOR_ATTACHMENT3
Definition: glext.h:1717
#define GL_COLOR_ATTACHMENT8
Definition: glext.h:1722
#define GL_COLOR_ATTACHMENT10
Definition: glext.h:1724
#define GL_COLOR_ATTACHMENT15
Definition: glext.h:1729
#define GL_COLOR_ATTACHMENT4
Definition: glext.h:1718
#define GL_COLOR_ATTACHMENT12
Definition: glext.h:1726
#define GL_DEPTH_ATTACHMENT
Definition: glext.h:1730
#define GL_COLOR_ATTACHMENT6
Definition: glext.h:1720
#define GL_COLOR_ATTACHMENT14
Definition: glext.h:1728
GLenum attachment
Definition: glext.h:6295
#define GL_STENCIL_ATTACHMENT
Definition: glext.h:1731

Referenced by context_dump_fbo_attachment().

◆ debug_fbostatus()

const char * debug_fbostatus ( GLenum  status)

Definition at line 5423 of file utils.c.

5423 {
5424 switch(status) {
5425#define FBOSTATUS_TO_STR(u) case u: return #u
5438#undef FBOSTATUS_TO_STR
5439 default:
5440 FIXME("Unrecognized FBO status 0x%08x.\n", status);
5441 return "unrecognized";
5442 }
5443}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define FBOSTATUS_TO_STR(u)
#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
Definition: glext.h:1747
#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB
Definition: glext.h:1770
#define GL_FRAMEBUFFER_UNDEFINED
Definition: glext.h:1682
#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT
Definition: glext.h:4442
#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
Definition: glext.h:1708
#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT
Definition: glext.h:1709
#define GL_FRAMEBUFFER_COMPLETE
Definition: glext.h:1707
#define GL_FRAMEBUFFER_UNSUPPORTED
Definition: glext.h:1712
#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER
Definition: glext.h:1711
#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER
Definition: glext.h:1710
#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS
Definition: glext.h:819
#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT
Definition: glext.h:4443
Definition: ps.c:97

Referenced by wined3d_context_gl_check_fbo_status().

◆ debug_glerror()

const char * debug_glerror ( GLenum  error)

Definition at line 5445 of file utils.c.

5445 {
5446 switch(error) {
5447#define GLERROR_TO_STR(u) case u: return #u
5456#undef GLERROR_TO_STR
5457 default:
5458 FIXME("Unrecognized GL error 0x%08x.\n", error);
5459 return "unrecognized";
5460 }
5461}
#define GLERROR_TO_STR(u)
#define GL_INVALID_VALUE
Definition: gl.h:695
#define GL_INVALID_OPERATION
Definition: gl.h:696
#define GL_STACK_OVERFLOW
Definition: gl.h:697
#define GL_NO_ERROR
Definition: gl.h:693
#define GL_OUT_OF_MEMORY
Definition: gl.h:699
#define GL_INVALID_ENUM
Definition: gl.h:694
#define GL_STACK_UNDERFLOW
Definition: gl.h:698
#define GL_INVALID_FRAMEBUFFER_OPERATION
Definition: glext.h:1672
#define error(str)
Definition: mkdosfs.c:1605

Referenced by match_allows_spec_alpha(), and wined3d_check_gl_call().

◆ ffp_vertex_update_clip_plane_constants()

void ffp_vertex_update_clip_plane_constants ( const struct wined3d_gl_info *  gl_info,
const struct wined3d_state *  state 
)

Definition at line 1007 of file ffp_gl.c.

1008{
1009 for (unsigned int i = 0; i < gl_info->limits.user_clip_distances; ++i)
1010 {
1011 GLdouble plane[4];
1012
1013 gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW);
1014 gl_info->gl_ops.gl.p_glPushMatrix();
1015 gl_info->gl_ops.gl.p_glLoadIdentity();
1016
1017 plane[0] = state->clip_planes[i].x;
1018 plane[1] = state->clip_planes[i].y;
1019 plane[2] = state->clip_planes[i].z;
1020 plane[3] = state->clip_planes[i].w;
1021
1022 gl_info->gl_ops.gl.p_glClipPlane(GL_CLIP_PLANE0 + i, plane);
1023 checkGLcall("glClipPlane");
1024
1025 gl_info->gl_ops.gl.p_glPopMatrix();
1026 }
1027}
static int state
Definition: maze.c:121
#define GL_CLIP_PLANE0
Definition: gl.h:346
double GLdouble
Definition: gl.h:163
#define GL_MODELVIEW
Definition: gl.h:245
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint GLenum GLenum GLenum GLint GLuint GLenum GLenum GLfloat GLenum GLfloat GLenum GLint const GLfloat GLenum GLint const GLushort GLint GLint GLsizei GLsizei GLenum GLsizei GLsizei GLenum GLenum const GLvoid GLenum plane
Definition: glfuncs.h:270
struct opengl_funcs gl_ops
Definition: wined3d_gl.h:353
struct wined3d_gl_limits limits
Definition: wined3d_gl.h:344
#define checkGLcall(A)
Definition: wined3d_gl.h:402

Referenced by shader_glsl_load_constants().

◆ install_gl_compat_wrapper()

void install_gl_compat_wrapper ( struct wined3d_gl_info *  gl_info,
enum wined3d_gl_extension  ext 
)

Definition at line 423 of file gl_compat.c.

424{
425 switch (ext)
426 {
427 case ARB_MULTITEXTURE:
428 if (gl_info->supported[ARB_MULTITEXTURE])
429 return;
430 if (gl_info->gl_ops.ext.p_glActiveTexture == wine_glActiveTexture)
431 {
432 FIXME("ARB_multitexture emulation hooks already applied.\n");
433 return;
434 }
435 TRACE("Applying GL_ARB_multitexture emulation hooks.\n");
436 gl_info->gl_ops.ext.p_glActiveTexture = wine_glActiveTexture;
437 gl_info->gl_ops.ext.p_glClientActiveTextureARB = wine_glClientActiveTextureARB;
438 gl_info->gl_ops.ext.p_glMultiTexCoord1fARB = wine_glMultiTexCoord1fARB;
439 gl_info->gl_ops.ext.p_glMultiTexCoord1fvARB = wine_glMultiTexCoord1fvARB;
440 gl_info->gl_ops.ext.p_glMultiTexCoord2fARB = wine_glMultiTexCoord2fARB;
441 gl_info->gl_ops.ext.p_glMultiTexCoord2fvARB = wine_glMultiTexCoord2fvARB;
442 gl_info->gl_ops.ext.p_glMultiTexCoord3fARB = wine_glMultiTexCoord3fARB;
443 gl_info->gl_ops.ext.p_glMultiTexCoord3fvARB = wine_glMultiTexCoord3fvARB;
444 gl_info->gl_ops.ext.p_glMultiTexCoord4fARB = wine_glMultiTexCoord4fARB;
445 gl_info->gl_ops.ext.p_glMultiTexCoord4fvARB = wine_glMultiTexCoord4fvARB;
446 gl_info->gl_ops.ext.p_glMultiTexCoord2svARB = wine_glMultiTexCoord2svARB;
447 gl_info->gl_ops.ext.p_glMultiTexCoord4svARB = wine_glMultiTexCoord4svARB;
448 old_multitex_glGetIntegerv = gl_info->gl_ops.gl.p_glGetIntegerv;
449 gl_info->gl_ops.gl.p_glGetIntegerv = wine_glGetIntegerv;
450 old_multitex_glGetFloatv = gl_info->gl_ops.gl.p_glGetFloatv;
451 gl_info->gl_ops.gl.p_glGetFloatv = wine_glGetFloatv;
452 old_multitex_glGetDoublev = gl_info->gl_ops.gl.p_glGetDoublev;
453 gl_info->gl_ops.gl.p_glGetDoublev = wine_glGetDoublev;
454 gl_info->supported[ARB_MULTITEXTURE] = TRUE;
455 return;
456
457 case EXT_FOG_COORD:
458 /* This emulation isn't perfect. There are a number of potential problems, but they should
459 * not matter in practise:
460 *
461 * Fog vs fragment shader: If we are using GL_ARB_fragment_program with the fog option, the
462 * glDisable(GL_FOG) here won't matter. However, if we have GL_ARB_fragment_program, it is pretty
463 * unlikely that we don't have GL_EXT_fog_coord. Besides, we probably have GL_ARB_vertex_program
464 * too, which would allow fog coord emulation in a fixed function vertex pipeline replacement.
465 *
466 * Fog vs texture: We apply the fog in the vertex color. An app could set up texturing settings which
467 * ignore the vertex color, thus effectively disabling our fog. However, in D3D this type of fog is
468 * a per-vertex fog too, so the apps shouldn't do that.
469 *
470 * Fog vs lighting: The app could in theory use D3DFOG_NONE table and D3DFOG_NONE vertex fog with
471 * untransformed vertices. That enables lighting and fog coords at the same time, and the lighting
472 * calculations could affect the already blended in fog color. There's nothing we can do against that,
473 * but most apps using fog color do their own lighting too and often even use RHW vertices. So live
474 * with it.
475 */
476 if (gl_info->supported[EXT_FOG_COORD])
477 return;
478 if (gl_info->gl_ops.gl.p_glFogi == wine_glFogi)
479 {
480 FIXME("EXT_fog_coord emulation hooks already applied.\n");
481 return;
482 }
483 TRACE("Applying GL_ARB_fog_coord emulation hooks\n");
484
485 /* This probably means that the implementation doesn't advertise the extension, but implicitly supports
486 * it via the GL core version, or someone messed around in the extension table in directx.c. Add version-
487 * dependent loading for this extension if we ever hit this situation
488 */
489 if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
490 {
491 FIXME("GL implementation supports GL_ARB_fragment_program but not GL_EXT_fog_coord\n");
492 FIXME("The fog coord emulation will most likely fail\n");
493 }
494 else if (gl_info->supported[ARB_FRAGMENT_SHADER])
495 {
496 FIXME("GL implementation supports GL_ARB_fragment_shader but not GL_EXT_fog_coord\n");
497 FIXME("The fog coord emulation will most likely fail\n");
498 }
499
500 old_fogcoord_glFogi = gl_info->gl_ops.gl.p_glFogi;
501 gl_info->gl_ops.gl.p_glFogi = wine_glFogi;
502 old_fogcoord_glFogiv = gl_info->gl_ops.gl.p_glFogiv;
503 gl_info->gl_ops.gl.p_glFogiv = wine_glFogiv;
504 old_fogcoord_glFogf = gl_info->gl_ops.gl.p_glFogf;
505 gl_info->gl_ops.gl.p_glFogf = wine_glFogf;
506 old_fogcoord_glFogfv = gl_info->gl_ops.gl.p_glFogfv;
507 gl_info->gl_ops.gl.p_glFogfv = wine_glFogfv;
508 old_fogcoord_glEnable = gl_info->p_glEnableWINE;
509 gl_info->p_glEnableWINE = wine_glEnable;
510 old_fogcoord_glDisable = gl_info->p_glDisableWINE;
511 gl_info->p_glDisableWINE = wine_glDisable;
512
513 old_fogcoord_glVertex4f = gl_info->gl_ops.gl.p_glVertex4f;
514 gl_info->gl_ops.gl.p_glVertex4f = wine_glVertex4f;
515 gl_info->gl_ops.gl.p_glVertex4fv = wine_glVertex4fv;
516 gl_info->gl_ops.gl.p_glVertex3f = wine_glVertex3f;
517 gl_info->gl_ops.gl.p_glVertex3fv = wine_glVertex3fv;
518
519 old_fogcoord_glColor4f = gl_info->gl_ops.gl.p_glColor4f;
520 gl_info->gl_ops.gl.p_glColor4f = wine_glColor4f;
521 gl_info->gl_ops.gl.p_glColor4fv = wine_glColor4fv;
522 gl_info->gl_ops.gl.p_glColor3f = wine_glColor3f;
523 gl_info->gl_ops.gl.p_glColor3fv = wine_glColor3fv;
524 gl_info->gl_ops.gl.p_glColor4ub = wine_glColor4ub;
525
526 gl_info->gl_ops.ext.p_glFogCoordfEXT = wine_glFogCoordfEXT;
527 gl_info->gl_ops.ext.p_glFogCoordfvEXT = wine_glFogCoordfvEXT;
528 gl_info->gl_ops.ext.p_glFogCoorddEXT = wine_glFogCoorddEXT;
529 gl_info->gl_ops.ext.p_glFogCoorddvEXT = wine_glFogCoorddvEXT;
530 gl_info->supported[EXT_FOG_COORD] = TRUE;
531 return;
532
533 default:
534 FIXME("Extension %u emulation not supported.\n", ext);
535 }
536}
#define TRUE
Definition: types.h:120
static const WCHAR *const ext[]
Definition: module.c:53
static void WINE_GLAPI wine_glFogCoordfEXT(GLfloat f)
Definition: gl_compat.c:405
static void WINE_GLAPI wine_glMultiTexCoord2fvARB(GLenum target, const GLfloat *v)
Definition: gl_compat.c:60
static void WINE_GLAPI wine_glFogiv(GLenum pname, const GLint *param)
Definition: gl_compat.c:225
static void WINE_GLAPI wine_glColor4ub(GLubyte r, GLubyte g, GLubyte b, GLubyte a)
Definition: gl_compat.c:399
static void WINE_GLAPI wine_glGetFloatv(GLenum pname, GLfloat *params)
Definition: gl_compat.c:155
static void WINE_GLAPI wine_glFogfv(GLenum pname, const GLfloat *param)
Definition: gl_compat.c:283
static void WINE_GLAPI wine_glFogf(GLenum pname, GLfloat param)
Definition: gl_compat.c:254
static void WINE_GLAPI wine_glActiveTexture(GLenum texture)
Definition: gl_compat.c:130
static void WINE_GLAPI wine_glMultiTexCoord4fvARB(GLenum target, const GLfloat *v)
Definition: gl_compat.c:100
static void WINE_GLAPI wine_glMultiTexCoord1fvARB(GLenum target, const GLfloat *v)
Definition: gl_compat.c:40
static void WINE_GLAPI wine_glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)
Definition: gl_compat.c:70
static void WINE_GLAPI wine_glMultiTexCoord2svARB(GLenum target, const GLshort *v)
Definition: gl_compat.c:110
static void WINE_GLAPI wine_glVertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
Definition: gl_compat.c:325
static void WINE_GLAPI wine_glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
Definition: gl_compat.c:50
static void WINE_GLAPI wine_glVertex3fv(const GLfloat *pos)
Definition: gl_compat.c:364
static void WINE_GLAPI wine_glColor3f(GLfloat r, GLfloat g, GLfloat b)
Definition: gl_compat.c:391
static void WINE_GLAPI wine_glColor3fv(const GLfloat *c)
Definition: gl_compat.c:395
static void WINE_GLAPI wine_glFogCoordfvEXT(const GLfloat *f)
Definition: gl_compat.c:414
static void WINE_GLAPI wine_glEnable(GLenum cap)
Definition: gl_compat.c:168
static void WINE_GLAPI wine_glGetIntegerv(GLenum pname, GLint *params)
Definition: gl_compat.c:146
static void WINE_GLAPI wine_glColor4fv(const GLfloat *c)
Definition: gl_compat.c:387
static void WINE_GLAPI wine_glFogi(GLenum pname, GLint param)
Definition: gl_compat.c:196
static void WINE_GLAPI wine_glVertex4fv(const GLfloat *pos)
Definition: gl_compat.c:356
static void WINE_GLAPI wine_glColor4f(GLfloat r, GLfloat g, GLfloat b, GLfloat a)
Definition: gl_compat.c:368
static void WINE_GLAPI wine_glFogCoorddEXT(GLdouble f)
Definition: gl_compat.c:411
static void WINE_GLAPI wine_glMultiTexCoord3fvARB(GLenum target, const GLfloat *v)
Definition: gl_compat.c:80
static void WINE_GLAPI wine_glDisable(GLenum cap)
Definition: gl_compat.c:182
static void WINE_GLAPI wine_glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
Definition: gl_compat.c:90
static void WINE_GLAPI wine_glVertex3f(GLfloat x, GLfloat y, GLfloat z)
Definition: gl_compat.c:360
static void WINE_GLAPI wine_glFogCoorddvEXT(const GLdouble *f)
Definition: gl_compat.c:417
static void WINE_GLAPI wine_glGetDoublev(GLenum pname, GLdouble *params)
Definition: gl_compat.c:161
static void WINE_GLAPI wine_glMultiTexCoord1fARB(GLenum target, GLfloat s)
Definition: gl_compat.c:30
static void WINE_GLAPI wine_glClientActiveTextureARB(GLenum texture)
Definition: gl_compat.c:138
static void WINE_GLAPI wine_glMultiTexCoord4svARB(GLenum target, const GLshort *v)
Definition: gl_compat.c:120
BOOL supported[WINED3D_GL_EXT_COUNT]
Definition: wined3d_gl.h:347

Referenced by wined3d_adapter_init_gl_caps().

◆ print_glsl_info_log()

void print_glsl_info_log ( const struct wined3d_gl_info *  gl_info,
GLuint  id,
BOOL  program 
)

Definition at line 485 of file glsl_shader.c.

486{
487 int length = 0;
488 char *log;
489
490 if (!WARN_ON(d3d_shader) && !FIXME_ON(d3d_shader))
491 return;
492
493 if (program)
494 GL_EXTCALL(glGetProgramiv(id, GL_INFO_LOG_LENGTH, &length));
495 else
496 GL_EXTCALL(glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length));
497
498 /* A size of 1 is just a null-terminated string, so the log should be bigger than
499 * that if there are errors. */
500 if (length > 1)
501 {
502 const char *ptr, *end, *line;
503
504 log = malloc(length);
505 if (program)
506 GL_EXTCALL(glGetProgramInfoLog(id, length, NULL, log));
507 else
508 GL_EXTCALL(glGetShaderInfoLog(id, length, NULL, log));
509
510 ptr = log;
511 /* The info log is supposed to be zero-terminated. Note that at least
512 * some versions of fglrx don't terminate the string properly. The
513 * reported length does include the supposed terminator though, so we
514 * don't care here. */
515 end = &ptr[length - 1];
516 if (gl_info->quirks & WINED3D_QUIRK_INFO_LOG_SPAM)
517 {
518 WARN("Info log received from GLSL shader #%u:\n", id);
519 while ((line = wined3d_get_line(&ptr, end)))
520 {
521 WARN(" %.*s", (int)(ptr - line), line);
522 }
523 }
524 else
525 {
526 FIXME("Info log received from GLSL shader #%u:\n", id);
527 while ((line = wined3d_get_line(&ptr, end)))
528 {
529 FIXME(" %.*s", (int)(ptr - line), line);
530 }
531 }
532 free(log);
533 }
534}
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
GLuint GLuint end
Definition: gl.h:1545
GLuint program
Definition: glext.h:6723
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
#define GL_INFO_LOG_LENGTH
Definition: glext.h:450
#define WARN_ON(c)
Definition: module.h:257
static PVOID ptr
Definition: dispmode.c:27
#define FIXME_ON(ch)
Definition: debug.h:418
#define log(outFile, fmt,...)
Definition: util.h:15
Definition: parser.c:49
uint32_t quirks
Definition: wined3d_gl.h:346
#define GL_EXTCALL(f)
Definition: wined3d_gl.h:360
#define WINED3D_QUIRK_INFO_LOG_SPAM
Definition: wined3d_gl.h:328
static const char * wined3d_get_line(const char **ptr, const char *end)

Referenced by draw_test_quad(), glsl_blitter_generate_program(), shader_glsl_compile(), shader_glsl_generate_vkd3d_shader(), and shader_glsl_validate_link().

◆ shader_glsl_validate_link()

void shader_glsl_validate_link ( const struct wined3d_gl_info *  gl_info,
GLuint  program 
)

Definition at line 617 of file glsl_shader.c.

618{
619 GLint tmp;
620
621 if (!TRACE_ON(d3d_shader) && !FIXME_ON(d3d_shader))
622 return;
623
624 GL_EXTCALL(glGetProgramiv(program, GL_LINK_STATUS, &tmp));
625 if (!tmp)
626 {
627 FIXME("Program %u link status invalid.\n", program);
629 }
630
632}
#define TRACE_ON(x)
Definition: compat.h:75
#define GL_LINK_STATUS
Definition: glext.h:448
static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLuint program)
Definition: glsl_shader.c:561
void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLuint id, BOOL program)
Definition: glsl_shader.c:485

Referenced by draw_test_quad(), glsl_blitter_generate_program(), set_glsl_shader_program(), and shader_glsl_compile_compute_shader().

◆ texture2d_get_blt_info()

void texture2d_get_blt_info ( const struct wined3d_texture_gl *  texture_gl,
unsigned int  sub_resource_idx,
const RECT *  rect,
struct wined3d_blt_info *  info 
)

Definition at line 173 of file texture.c.

175{
176 struct wined3d_vec3 *coords = info->texcoords;
177 struct wined3d_rect_f f;
178 unsigned int level;
180 GLsizei w, h;
181
182 level = sub_resource_idx % texture_gl->t.level_count;
183 w = wined3d_texture_get_level_width(&texture_gl->t, level);
184 h = wined3d_texture_get_level_height(&texture_gl->t, level);
185 target = wined3d_texture_gl_get_sub_resource_target(texture_gl, sub_resource_idx);
186
187 switch (target)
188 {
189 default:
190 FIXME("Unsupported texture target %#x.\n", target);
191 /* Fall back to GL_TEXTURE_2D */
192 case GL_TEXTURE_2D:
193 info->bind_target = GL_TEXTURE_2D;
194 coords[0].x = (float)rect->left / w;
195 coords[0].y = (float)rect->top / h;
196 coords[0].z = 0.0f;
197
198 coords[1].x = (float)rect->right / w;
199 coords[1].y = (float)rect->top / h;
200 coords[1].z = 0.0f;
201
202 coords[2].x = (float)rect->left / w;
203 coords[2].y = (float)rect->bottom / h;
204 coords[2].z = 0.0f;
205
206 coords[3].x = (float)rect->right / w;
207 coords[3].y = (float)rect->bottom / h;
208 coords[3].z = 0.0f;
209 break;
210
212 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
214
215 coords[0].x = 1.0f; coords[0].y = -f.t; coords[0].z = -f.l;
216 coords[1].x = 1.0f; coords[1].y = -f.t; coords[1].z = -f.r;
217 coords[2].x = 1.0f; coords[2].y = -f.b; coords[2].z = -f.l;
218 coords[3].x = 1.0f; coords[3].y = -f.b; coords[3].z = -f.r;
219 break;
220
222 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
224
225 coords[0].x = -1.0f; coords[0].y = -f.t; coords[0].z = f.l;
226 coords[1].x = -1.0f; coords[1].y = -f.t; coords[1].z = f.r;
227 coords[2].x = -1.0f; coords[2].y = -f.b; coords[2].z = f.l;
228 coords[3].x = -1.0f; coords[3].y = -f.b; coords[3].z = f.r;
229 break;
230
232 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
234
235 coords[0].x = f.l; coords[0].y = 1.0f; coords[0].z = f.t;
236 coords[1].x = f.r; coords[1].y = 1.0f; coords[1].z = f.t;
237 coords[2].x = f.l; coords[2].y = 1.0f; coords[2].z = f.b;
238 coords[3].x = f.r; coords[3].y = 1.0f; coords[3].z = f.b;
239 break;
240
242 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
244
245 coords[0].x = f.l; coords[0].y = -1.0f; coords[0].z = -f.t;
246 coords[1].x = f.r; coords[1].y = -1.0f; coords[1].z = -f.t;
247 coords[2].x = f.l; coords[2].y = -1.0f; coords[2].z = -f.b;
248 coords[3].x = f.r; coords[3].y = -1.0f; coords[3].z = -f.b;
249 break;
250
252 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
254
255 coords[0].x = f.l; coords[0].y = -f.t; coords[0].z = 1.0f;
256 coords[1].x = f.r; coords[1].y = -f.t; coords[1].z = 1.0f;
257 coords[2].x = f.l; coords[2].y = -f.b; coords[2].z = 1.0f;
258 coords[3].x = f.r; coords[3].y = -f.b; coords[3].z = 1.0f;
259 break;
260
262 info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
264
265 coords[0].x = -f.l; coords[0].y = -f.t; coords[0].z = -1.0f;
266 coords[1].x = -f.r; coords[1].y = -f.t; coords[1].z = -1.0f;
267 coords[2].x = -f.l; coords[2].y = -f.b; coords[2].z = -1.0f;
268 coords[3].x = -f.r; coords[3].y = -f.b; coords[3].z = -1.0f;
269 break;
270 }
271}
RECT rect
Definition: combotst.c:67
static void cube_coords_float(const RECT *r, UINT w, UINT h, struct wined3d_rect_f *f)
Definition: texture.c:165
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y
Definition: gl.h:1792
GLint level
Definition: gl.h:1546
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
Definition: gl.h:1795
unsigned int GLenum
Definition: gl.h:150
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
Definition: gl.h:1793
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z
Definition: gl.h:1794
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X
Definition: gl.h:1790
int GLsizei
Definition: gl.h:160
#define GL_TEXTURE_2D
Definition: gl.h:645
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X
Definition: gl.h:1791
GLuint coords
Definition: glext.h:7368
#define GL_TEXTURE_CUBE_MAP_ARB
Definition: glext.h:1230
GLfloat f
Definition: glext.h:7540
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6102
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
static float(__cdecl *square_half_float)(float x
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
Definition: tools.h:99
struct wined3d_texture t
Definition: wined3d_gl.h:941
static GLenum wined3d_texture_gl_get_sub_resource_target(const struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx)
Definition: wined3d_gl.h:964
static unsigned int wined3d_texture_get_level_height(const struct wined3d_texture *texture, unsigned int level)
static unsigned int wined3d_texture_get_level_width(const struct wined3d_texture *texture, unsigned int level)

Referenced by wined3d_context_gl_draw_shaded_quad().

◆ texture2d_read_from_framebuffer()

void texture2d_read_from_framebuffer ( struct wined3d_texture *  texture,
unsigned int  sub_resource_idx,
struct wined3d_context *  context,
DWORD  src_location,
DWORD  dst_location 
)

Definition at line 343 of file surface.c.

345{
346 struct wined3d_resource *resource = &texture->resource;
347 struct wined3d_device *device = resource->device;
348 const struct wined3d_format_gl *format_gl;
349 struct wined3d_texture *restore_texture;
350 const struct wined3d_gl_info *gl_info;
351 struct wined3d_context_gl *context_gl;
352 unsigned int row_pitch, slice_pitch;
353 unsigned int width, height, level;
355 bool restore_context = false;
356 unsigned int restore_idx;
357 BYTE *row, *top, *bottom;
358 BOOL src_is_upside_down;
359 BYTE *mem = NULL;
361 unsigned int i;
362
363 TRACE("texture %p, sub_resource_idx %u, context %p, src_location %s, dst_location %s.\n",
364 texture, sub_resource_idx, context, wined3d_debug_location(src_location), wined3d_debug_location(dst_location));
365
366 /* dst_location was already prepared by the caller. */
367 wined3d_texture_get_bo_address(texture, sub_resource_idx, &data, dst_location);
368 offset = data.addr;
369
370 restore_texture = context->current_rt.texture;
371 restore_idx = context->current_rt.sub_resource_idx;
372 if (!wined3d_resource_is_offscreen(resource) && (restore_texture != texture || restore_idx != sub_resource_idx))
373 {
374 context = context_acquire(device, texture, sub_resource_idx);
375 restore_context = true;
376 }
377 context_gl = wined3d_context_gl(context);
378 gl_info = context_gl->gl_info;
379
380 if (resource->format->depth_size || resource->format->stencil_size)
382 NULL, 0, resource, sub_resource_idx, src_location);
383 else
385 resource, sub_resource_idx, NULL, 0, src_location);
386
387 /* Select the correct read buffer, and give some debug output. There is no
388 * need to keep track of the current read buffer or reset it, every part
389 * of the code that reads pixels sets the read buffer as desired. */
391 {
392 /* Mapping the primary render target which is not on a swapchain.
393 * Read from the back buffer. */
394 TRACE("Mapping offscreen render target.\n");
395 gl_info->gl_ops.gl.p_glReadBuffer(wined3d_context_gl_get_offscreen_gl_buffer(context_gl));
396 src_is_upside_down = TRUE;
397 }
398 else
399 {
400 /* Onscreen surfaces are always part of a swapchain */
402 TRACE("Mapping %#x buffer.\n", buffer);
403 gl_info->gl_ops.gl.p_glReadBuffer(buffer);
404 src_is_upside_down = FALSE;
405 }
406 checkGLcall("glReadBuffer");
408
409 if (data.buffer_object)
410 {
411 GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, wined3d_bo_gl(data.buffer_object)->id));
412 checkGLcall("glBindBuffer");
413 offset += data.buffer_object->buffer_offset;
414 }
415 else
416 {
417 GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
418 checkGLcall("glBindBuffer");
419 }
420
421 level = sub_resource_idx % texture->level_count;
422 wined3d_texture_get_pitch(texture, level, &row_pitch, &slice_pitch);
423 format_gl = wined3d_format_gl(resource->format);
424
425 /* Setup pixel store pack state -- to glReadPixels into the correct place */
426 gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH, row_pitch / format_gl->f.byte_count);
427 checkGLcall("glPixelStorei");
428
431 gl_info->gl_ops.gl.p_glReadPixels(0, 0, width, height,
432 format_gl->format, format_gl->type, offset);
433 checkGLcall("glReadPixels");
434
435 /* Reset previous pixel store pack state */
436 gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH, 0);
437 checkGLcall("glPixelStorei");
438
439 if (!src_is_upside_down)
440 {
441 /* glReadPixels returns the image upside down, and there is no way to
442 * prevent this. Flip the lines in software. */
443
444 if (!(row = malloc(row_pitch)))
445 goto error;
446
447 if (data.buffer_object)
448 {
450 checkGLcall("glMapBuffer");
451 }
452 mem += (uintptr_t)offset;
453
454 top = mem;
455 bottom = mem + row_pitch * (height - 1);
456 for (i = 0; i < height / 2; i++)
457 {
458 memcpy(row, top, row_pitch);
459 memcpy(top, bottom, row_pitch);
460 memcpy(bottom, row, row_pitch);
461 top += row_pitch;
462 bottom -= row_pitch;
463 }
464 free(row);
465
466 if (data.buffer_object)
467 GL_EXTCALL(glUnmapBuffer(GL_PIXEL_PACK_BUFFER));
468 }
469
470error:
471 if (data.buffer_object)
472 {
473 GL_EXTCALL(glBindBuffer(GL_PIXEL_PACK_BUFFER, 0));
474 wined3d_context_gl_reference_bo(context_gl, wined3d_bo_gl(data.buffer_object));
475 checkGLcall("glBindBuffer");
476 }
477
478 if (restore_context)
479 context_restore(context, restore_texture, restore_idx);
480}
GLenum wined3d_context_gl_get_offscreen_gl_buffer(const struct wined3d_context_gl *context_gl)
Definition: context_gl.c:3139
#define FALSE
Definition: types.h:117
void context_restore(struct wined3d_context *context, struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: context.c:55
BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource)
Definition: resource.c:406
GLenum wined3d_texture_get_gl_buffer(const struct wined3d_texture *texture)
Definition: texture.c:113
void wined3d_texture_get_bo_address(const struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_bo_address *data, uint32_t location)
Definition: texture.c:727
void CDECL wined3d_texture_get_pitch(const struct wined3d_texture *texture, unsigned int level, unsigned int *row_pitch, unsigned int *slice_pitch)
Definition: texture.c:1697
unsigned int uintptr_t
Definition: corecrt.h:185
unsigned char uint8_t
Definition: stdint.h:33
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GL_PACK_ROW_LENGTH
Definition: gl.h:628
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint buffer
Definition: glext.h:5915
GLintptr offset
Definition: glext.h:5920
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
#define GL_PIXEL_PACK_BUFFER
Definition: glext.h:476
GLint GLint bottom
Definition: glext.h:7726
#define GL_READ_WRITE
Definition: glext.h:343
#define GL_READ_FRAMEBUFFER
Definition: glext.h:1698
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
Definition: mem.c:349
const struct wined3d_gl_info * gl_info
Definition: wined3d_gl.h:603
struct wined3d_format f
Definition: wined3d_gl.h:1142
static void wined3d_context_gl_reference_bo(struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo_gl)
Definition: wined3d_gl.h:912
static struct wined3d_context * context_acquire(struct wined3d_device *device, struct wined3d_texture *texture, unsigned int sub_resource_idx)
unsigned char BYTE
Definition: xxhash.c:193

Referenced by wined3d_texture_gl_load_sysmem().

◆ wined3d_adapter_gl()

static struct wined3d_adapter_gl * wined3d_adapter_gl ( struct wined3d_adapter *  adapter)
inlinestatic

Definition at line 806 of file wined3d_gl.h.

807{
809}
return adapter
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

◆ wined3d_adapter_gl_const()

◆ wined3d_adapter_gl_init_format_info()

BOOL wined3d_adapter_gl_init_format_info ( struct wined3d_adapter *  adapter,
struct wined3d_caps_gl_ctx *  ctx 
)

Definition at line 4177 of file utils.c.

4178{
4180
4182 return FALSE;
4183
4184 if (!init_format_texture_info(adapter, gl_info)) goto fail;
4185 if (!init_format_vertex_info(adapter, gl_info)) goto fail;
4186
4187 apply_format_fixups(adapter, gl_info);
4192
4193 if (!init_typeless_formats(adapter)) goto fail;
4194
4195 return TRUE;
4196
4197fail:
4198 free(adapter->formats);
4199 adapter->formats = NULL;
4200 return FALSE;
4201}
static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
Definition: utils.c:3160
static BOOL init_typeless_formats(const struct wined3d_adapter *adapter)
Definition: utils.c:3764
static BOOL init_format_vertex_info(const struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
Definition: utils.c:3735
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
Definition: utils.c:3492
static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx)
Definition: utils.c:2788
static BOOL wined3d_adapter_init_format_info(struct wined3d_adapter *adapter, size_t format_size)
Definition: utils.c:4107
static void init_format_gen_mipmap_info(const struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
Definition: utils.c:3831
static void init_format_depth_bias_scale(struct wined3d_adapter *adapter, struct wined3d_caps_gl_ctx *ctx)
Definition: utils.c:4078
static void init_format_filter_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
Definition: utils.c:3373
struct wined3d_gl_info gl_info
Definition: wined3d_gl.h:800

Referenced by wined3d_adapter_gl_init().

◆ wined3d_allocator_chunk_gl()

Definition at line 825 of file wined3d_gl.h.

826{
828}
const GLubyte * c
Definition: glext.h:8905

◆ wined3d_allocator_chunk_gl_lock()

static void wined3d_allocator_chunk_gl_lock ( struct wined3d_allocator_chunk_gl *  chunk_gl)
inlinestatic

Definition at line 890 of file wined3d_gl.h.

891{
893}
struct wined3d_allocator_chunk c
Definition: wined3d_gl.h:820
static void wined3d_device_gl_allocator_lock(struct wined3d_device_gl *device_gl)
Definition: wined3d_gl.h:880
static struct wined3d_device_gl * wined3d_device_gl_from_allocator(struct wined3d_allocator *allocator)
Definition: wined3d_gl.h:875

Referenced by adapter_gl_alloc_bo(), wined3d_allocator_chunk_gl_map(), and wined3d_allocator_chunk_gl_unmap().

◆ wined3d_allocator_chunk_gl_unlock()

static void wined3d_allocator_chunk_gl_unlock ( struct wined3d_allocator_chunk_gl *  chunk_gl)
inlinestatic

Definition at line 895 of file wined3d_gl.h.

896{
898}
static void wined3d_device_gl_allocator_unlock(struct wined3d_device_gl *device_gl)
Definition: wined3d_gl.h:885

Referenced by adapter_gl_alloc_bo(), wined3d_allocator_chunk_gl_map(), and wined3d_allocator_chunk_gl_unmap().

◆ wined3d_bo_gl()

static struct wined3d_bo_gl * wined3d_bo_gl ( struct wined3d_bo *  bo)
inlinestatic

Definition at line 429 of file wined3d_gl.h.

430{
431 return CONTAINING_RECORD(bo, struct wined3d_bo_gl, b);
432}
GLboolean GLboolean GLboolean b
Definition: glext.h:6204

◆ wined3d_bo_gl_id()

static GLuint wined3d_bo_gl_id ( struct wined3d_bo *  bo)
inlinestatic

Definition at line 434 of file wined3d_gl.h.

435{
436 return bo ? wined3d_bo_gl(bo)->id : 0;
437}

Referenced by wined3d_context_gl_load_numbered_arrays().

◆ wined3d_buffer_gl()

static struct wined3d_buffer_gl * wined3d_buffer_gl ( struct wined3d_buffer *  buffer)
inlinestatic

Definition at line 1049 of file wined3d_gl.h.

1050{
1052}

◆ wined3d_buffer_gl_binding_from_bind_flags()

GLenum wined3d_buffer_gl_binding_from_bind_flags ( const struct wined3d_gl_info *  gl_info,
uint32_t  bind_flags 
)

Definition at line 136 of file buffer.c.

137{
138 if (!bind_flags)
140
141 /* We must always return GL_ELEMENT_ARRAY_BUFFER here;
142 * wined3d_device_gl_create_bo() checks the GL binding to see whether we
143 * can suballocate, and we cannot suballocate if this BO might be used for
144 * an index buffer. */
145 if (bind_flags & WINED3D_BIND_INDEX_BUFFER)
147
150 return GL_TEXTURE_BUFFER;
151
152 if (bind_flags & WINED3D_BIND_CONSTANT_BUFFER)
153 return GL_UNIFORM_BUFFER;
154
155 if (bind_flags & WINED3D_BIND_STREAM_OUTPUT)
157
158 if (bind_flags & WINED3D_BIND_INDIRECT_BUFFER
159 && gl_info->supported[ARB_DRAW_INDIRECT])
161
163 FIXME("Unhandled bind flags %#x.\n", bind_flags);
164
165 return GL_ARRAY_BUFFER;
166}
#define GL_UNIFORM_BUFFER
Definition: glext.h:1846
#define GL_ARRAY_BUFFER
Definition: glext.h:336
#define GL_TEXTURE_BUFFER
Definition: glext.h:748
#define GL_TRANSFORM_FEEDBACK_BUFFER
Definition: glext.h:557
#define GL_ELEMENT_ARRAY_BUFFER
Definition: glext.h:337
#define GL_DRAW_INDIRECT_BUFFER
Definition: glext.h:2046
#define GL_PIXEL_UNPACK_BUFFER
Definition: glext.h:477
#define WINED3D_BIND_VERTEX_BUFFER
Definition: wined3d.h:909
#define WINED3D_BIND_UNORDERED_ACCESS
Definition: wined3d.h:916
#define WINED3D_BIND_SHADER_RESOURCE
Definition: wined3d.h:912
#define WINED3D_BIND_INDIRECT_BUFFER
Definition: wined3d.h:917
#define WINED3D_BIND_CONSTANT_BUFFER
Definition: wined3d.h:911
#define WINED3D_BIND_STREAM_OUTPUT
Definition: wined3d.h:913
#define WINED3D_BIND_INDEX_BUFFER
Definition: wined3d.h:910

Referenced by adapter_gl_alloc_bo(), and wined3d_buffer_gl_create_buffer_object().

◆ wined3d_buffer_gl_const()

static const struct wined3d_buffer_gl * wined3d_buffer_gl_const ( const struct wined3d_buffer *  buffer)
inlinestatic

Definition at line 1054 of file wined3d_gl.h.

1055{
1057}

◆ wined3d_buffer_gl_init()

HRESULT wined3d_buffer_gl_init ( struct wined3d_buffer_gl *  buffer_gl,
struct wined3d_device *  device,
const struct wined3d_buffer_desc *  desc,
const struct wined3d_sub_resource_data *  data,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 1101 of file buffer.c.

1104{
1105 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
1106
1107 TRACE("buffer_gl %p, device %p, desc %p, data %p, parent %p, parent_ops %p.\n",
1108 buffer_gl, device, desc, data, parent, parent_ops);
1109
1110 /* Observations show that draw_primitive_immediate_mode() is faster on
1111 * dynamic vertex buffers than converting + draw_primitive_arrays().
1112 * (Half-Life 2 and others.) */
1113 if (!(desc->access & WINED3D_RESOURCE_ACCESS_GPU))
1114 TRACE("Not creating a BO because the buffer is not GPU accessible.\n");
1115 else if (!gl_info->supported[ARB_VERTEX_BUFFER_OBJECT])
1116 TRACE("Not creating a BO because GL_ARB_vertex_buffer is not supported.\n");
1117 else if (!(gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE])
1118 && (desc->usage & WINED3DUSAGE_DYNAMIC))
1119 TRACE("Not creating a BO because the buffer has dynamic usage and no GL support.\n");
1120 else
1121 buffer_gl->b.flags |= WINED3D_BUFFER_USE_BO;
1122
1123 return wined3d_buffer_init(&buffer_gl->b, device, desc, data, parent, parent_ops, &wined3d_buffer_gl_ops);
1124}
static HRESULT wined3d_buffer_init(struct wined3d_buffer *buffer, struct wined3d_device *device, const struct wined3d_buffer_desc *desc, const struct wined3d_sub_resource_data *data, void *parent, const struct wined3d_parent_ops *parent_ops, const struct wined3d_buffer_ops *buffer_ops)
Definition: buffer.c:931
static const struct wined3d_buffer_ops wined3d_buffer_gl_ops
Definition: buffer.c:1095
#define WINED3D_BUFFER_USE_BO
Definition: buffer.c:32
r parent
Definition: btrfs.c:3010
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
struct wined3d_buffer b
Definition: wined3d_gl.h:1046
#define WINED3D_RESOURCE_ACCESS_GPU
Definition: wined3d.h:51
#define WINED3DUSAGE_DYNAMIC
Definition: wined3d.h:924

Referenced by adapter_gl_create_buffer().

◆ wined3d_caps_gl_ctx_test_filling_convention()

bool wined3d_caps_gl_ctx_test_filling_convention ( struct wined3d_caps_gl_ctx *  ctx,
float  offset 
)

Definition at line 3896 of file utils.c.

3897{
3898 static const struct wined3d_color red = {1.0f, 0.0f, 0.0f, 1.0f};
3899 const struct wined3d_gl_info *gl_info = ctx->gl_info;
3900 unsigned int x, y, clear = 0, draw = 0;
3901 GLuint texture, fbo;
3902 uint32_t readback[8][8];
3903
3904 /* This is a very simple test to find out how GL handles polygon edges:
3905 * Draw a 1x1 quad exactly through 4 adjacent pixel centers in an 8x8
3906 * viewport and see which pixel it ends up in. So far we've seen top left
3907 * and bottom left conventions. This test may produce unexpected results
3908 * if the driver forces multisampling on us.
3909 *
3910 * If we find a bottom-left filling behavior we also move the x-axis
3911 * by the same amount. This is necessary to keep diagonals that go
3912 * through the pixel center intact.
3913 *
3914 * Note that we are ignoring some settings that might influence the
3915 * driver: How we switch GL to an upper-left coordinate system,
3916 * shaders vs fixed function GL. Testing these isn't possible with
3917 * the current draw_test_quad() infrastructure. Also the test is
3918 * skipped if we are not using FBOs. Drawing into the onscreen
3919 * frame buffer may also yield different driver behavior.
3920 *
3921 * The minimum offset also depends on the viewport size, although
3922 * the relation between those two is GPU dependent and not exactly
3923 * sensible. E.g. a 8192x8192 viewport on a GeForce 9 needs at
3924 * least an offset of 1/240.9, whereas a 8x8 one needs 1/255.982;
3925 * 32x32 needs 1/255.935. 4x4 and lower are happy with something
3926 * below 1/256. The 8x8 size below has been arbitrarily chosen to
3927 * get a useful result out of that card and avoid allocating a
3928 * gigantic texture during library init.
3929 *
3930 * Newer cards usually do the right thing anyway. In cases where
3931 * they do not (e.g. Radeon GPUs in a macbookpro14,3 running MacOS)
3932 * an offset of 1/2^20 is enough. */
3933 const struct wined3d_vec3 edge_geometry[] =
3934 {
3935 {(-1.0f + offset) / 8.0f, (-1.0f + offset) / 8.0f, 0.0f},
3936 {( 1.0f + offset) / 8.0f, (-1.0f + offset) / 8.0f, 0.0f},
3937 {(-1.0f + offset) / 8.0f, ( 1.0f + offset) / 8.0f, 0.0f},
3938 {( 1.0f + offset) / 8.0f, ( 1.0f + offset) / 8.0f, 0.0f},
3939 };
3940
3941 gl_info->gl_ops.gl.p_glGenTextures(1, &texture);
3942 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
3943 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
3944 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 8, 8, 0,
3946 gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
3947 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3948 gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
3950 checkGLcall("create resources");
3951
3952 gl_info->gl_ops.gl.p_glViewport(0, 0, 8, 8);
3953 gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
3954 gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
3955
3956 draw_test_quad(ctx, edge_geometry, &red);
3957 checkGLcall("draw");
3958
3959 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
3960 gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0,
3962 checkGLcall("readback");
3963
3964 gl_info->gl_ops.gl.p_glDeleteTextures(1, &texture);
3965 gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
3966 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
3967 checkGLcall("delete resources");
3968
3969 /* We expect that exactly one fragment is generated. */
3970 for (y = 0; y < ARRAY_SIZE(readback); ++y)
3971 {
3972 for (x = 0; x < ARRAY_SIZE(readback[0]); ++x)
3973 {
3974 if (readback[y][x] == 0xff0000ff)
3975 clear++;
3976 else if (readback[y][x] == 0xffff0000)
3977 draw++;
3978 }
3979 }
3980
3981 if (clear != 63 || draw != 1)
3982 {
3983 FIXME("Unexpected filling convention test result.\n");
3984 return FALSE;
3985 }
3986
3987 /* One pixel was drawn, check if it is the expected one */
3988 return readback[3][3] == 0xffff0000;
3989}
#define ARRAY_SIZE(A)
Definition: main.h:20
static void draw_test_quad(struct wined3d_caps_gl_ctx *ctx, const struct wined3d_vec3 *geometry, const struct wined3d_color *color)
Definition: utils.c:2371
#define GL_RGBA8
Definition: gl.h:762
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define GL_TEXTURE_MAX_LEVEL
Definition: gl.h:1504
#define GL_BGRA
Definition: gl.h:1485
unsigned int GLuint
Definition: gl.h:159
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define GL_COLOR_BUFFER_BIT
Definition: gl.h:716
#define GL_UNSIGNED_INT_8_8_8_8_REV
Definition: gl.h:1495
#define GL_FRAMEBUFFER
Definition: glext.h:1732
#define red
Definition: linetest.c:67
struct wined3d_fbo_ops fbo_ops
Definition: wined3d_gl.h:354

Referenced by wined3d_adapter_find_fill_offset().

◆ wined3d_caps_gl_ctx_test_viewport_subpixel_bits()

BOOL wined3d_caps_gl_ctx_test_viewport_subpixel_bits ( struct wined3d_caps_gl_ctx *  ctx)

Definition at line 3849 of file utils.c.

3850{
3851 static const struct wined3d_color red = {1.0f, 0.0f, 0.0f, 1.0f};
3852 const struct wined3d_gl_info *gl_info = ctx->gl_info;
3853 static const float offset = -63.0f / 128.0f;
3854 GLuint texture, fbo;
3855 uint32_t readback[4];
3856 unsigned int i;
3857
3858 gl_info->gl_ops.gl.p_glGenTextures(1, &texture);
3859 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
3860 gl_info->gl_ops.gl.p_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
3861 gl_info->gl_ops.gl.p_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, ARRAY_SIZE(readback), 1, 0,
3863 gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
3864 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3865 gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
3867 checkGLcall("create resources");
3868
3869 gl_info->gl_ops.gl.p_glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
3870 gl_info->gl_ops.gl.p_glClear(GL_COLOR_BUFFER_BIT);
3871 GL_EXTCALL(glViewportIndexedf(0, offset, offset, 4.0f, 1.0f));
3873 checkGLcall("draw");
3874
3875 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, texture);
3876 gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_2D, 0,
3878 checkGLcall("readback");
3879
3880 TRACE("Readback colors are 0x%08x, 0x%08x, 0x%08x, 0x%08x.\n",
3881 readback[0], readback[1], readback[2], readback[3]);
3882
3883 gl_info->gl_ops.gl.p_glDeleteTextures(1, &texture);
3884 gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
3885 gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
3886 checkGLcall("delete resources");
3887
3888 for (i = 0; i < ARRAY_SIZE(readback); ++i)
3889 {
3890 if (readback[i] != 0xffff0000)
3891 return FALSE;
3892 }
3893 return TRUE;
3894}

Referenced by match_broken_viewport_subpixel_bits().

◆ wined3d_check_gl_call()

void wined3d_check_gl_call ( const struct wined3d_gl_info *  gl_info,
const char *  file,
unsigned int  line,
const char *  name 
)

Definition at line 1831 of file context_gl.c.

1833{
1834 GLint err;
1835
1836 if (gl_info->supported[ARB_DEBUG_OUTPUT] || (err = gl_info->gl_ops.gl.p_glGetError()) == GL_NO_ERROR)
1837 {
1838 TRACE("%s call ok %s / %u.\n", name, file, line);
1839 return;
1840 }
1841
1842 do
1843 {
1844 ERR(">>>>>>> %s (%#x) from %s @ %s / %u.\n",
1846 err = gl_info->gl_ops.gl.p_glGetError();
1847 } while (err != GL_NO_ERROR);
1848}
#define ERR(fmt,...)
Definition: precomp.h:57
const char * debug_glerror(GLenum error)
Definition: utils.c:5445
#define err(...)
Definition: fci.c:123

◆ wined3d_context_gl()

static struct wined3d_context_gl * wined3d_context_gl ( struct wined3d_context *  context)
inlinestatic

Definition at line 694 of file wined3d_gl.h.

695{
697}

◆ wined3d_context_gl_acquire()

struct wined3d_context * wined3d_context_gl_acquire ( const struct wined3d_device *  device,
struct wined3d_texture *  texture,
unsigned int  sub_resource_idx 
)

Definition at line 4319 of file context_gl.c.

4321{
4322 struct wined3d_context_gl *current_context = wined3d_context_gl_get_current();
4323 struct wined3d_context_gl *context_gl;
4324
4325 TRACE("device %p, texture %p, sub_resource_idx %u.\n", device, texture, sub_resource_idx);
4326
4327 if (current_context && current_context->c.destroyed)
4328 current_context = NULL;
4329
4330 if (!texture)
4331 {
4332 if (current_context
4333 && current_context->c.device == device)
4334 {
4335 texture = current_context->c.current_rt.texture;
4336 sub_resource_idx = current_context->c.current_rt.sub_resource_idx;
4337 }
4338 else
4339 {
4340 struct wined3d_swapchain *swapchain = device->swapchains[0];
4341
4342 if (swapchain->back_buffers)
4343 texture = swapchain->back_buffers[0];
4344 else
4345 texture = swapchain->front_buffer;
4346 sub_resource_idx = 0;
4347 }
4348 }
4349
4350 if (current_context && current_context->c.current_rt.texture == texture)
4351 {
4352 context_gl = current_context;
4353 }
4354 else if (!wined3d_resource_is_offscreen(&texture->resource))
4355 {
4356 TRACE("Rendering onscreen.\n");
4357
4358 if (!(context_gl = wined3d_swapchain_gl_get_context(wined3d_swapchain_gl(texture->swapchain))))
4359 return NULL;
4360 }
4361 else
4362 {
4363 TRACE("Rendering offscreen.\n");
4364
4365 /* Stay with the current context if possible. Otherwise use the
4366 * context for the primary swapchain. */
4367 if (current_context && current_context->c.device == device)
4368 context_gl = current_context;
4369 else if (!(context_gl = wined3d_swapchain_gl_get_context(wined3d_swapchain_gl(device->swapchains[0]))))
4370 return NULL;
4371 }
4372
4373 wined3d_context_gl_activate(context_gl, texture, sub_resource_idx);
4374
4375 return &context_gl->c;
4376}
static void wined3d_context_gl_activate(struct wined3d_context_gl *context_gl, struct wined3d_texture *texture, unsigned int sub_resource_idx)
Definition: context_gl.c:4293
struct wined3d_context_gl * wined3d_context_gl_get_current(void)
Definition: context_gl.c:1566
struct wined3d_texture ** back_buffers
struct wined3d_texture * front_buffer
struct wined3d_context_gl * wined3d_swapchain_gl_get_context(struct wined3d_swapchain_gl *swapchain_gl)
Definition: swapchain.c:1798

Referenced by adapter_gl_acquire_context().

◆ wined3d_context_gl_active_texture()

void wined3d_context_gl_active_texture ( struct wined3d_context_gl *  context_gl,
const struct wined3d_gl_info *  gl_info,
unsigned int  unit 
)

Definition at line 2489 of file context_gl.c.

2491{
2493 checkGLcall("glActiveTexture");
2494 context_gl->active_texture = unit;
2495}
#define GL_TEXTURE0
Definition: gl.h:1750
GLAPI void GLAPIENTRY glActiveTexture(GLenum texture)
png_const_structrp png_const_inforp int * unit
Definition: png.h:2392
unsigned int active_texture
Definition: wined3d_gl.h:621

Referenced by glsl_blitter_upload_palette(), wined3d_context_gl_apply_blit_state(), wined3d_context_gl_bind_shader_resources(), wined3d_context_gl_init(), wined3d_device_gl_create_dummy_textures(), and wined3d_shader_resource_view_gl_bind().

◆ wined3d_context_gl_alloc_fence()

void wined3d_context_gl_alloc_fence ( struct wined3d_context_gl *  context_gl,
struct wined3d_fence *  fence 
)

Definition at line 925 of file context_gl.c.

926{
927 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
928
929 if (context_gl->free_fence_count)
930 {
931 fence->object = context_gl->free_fences[--context_gl->free_fence_count];
932 }
933 else
934 {
935 if (gl_info->supported[ARB_SYNC])
936 {
937 /* Using ARB_sync, not much to do here. */
938 fence->object.sync = NULL;
939 TRACE("Allocated sync object in context %p.\n", context_gl);
940 }
941 else if (gl_info->supported[APPLE_FENCE])
942 {
943 GL_EXTCALL(glGenFencesAPPLE(1, &fence->object.id));
944 checkGLcall("glGenFencesAPPLE");
945
946 TRACE("Allocated fence %u in context %p.\n", fence->object.id, context_gl);
947 }
948 else if(gl_info->supported[NV_FENCE])
949 {
950 GL_EXTCALL(glGenFencesNV(1, &fence->object.id));
951 checkGLcall("glGenFencesNV");
952
953 TRACE("Allocated fence %u in context %p.\n", fence->object.id, context_gl);
954 }
955 else
956 {
957 WARN("Fences not supported, not allocating fence.\n");
958 fence->object.id = 0;
959 }
960 }
961
962 fence->context_gl = context_gl;
963 list_add_head(&context_gl->fences, &fence->entry);
964}
static void list_add_head(struct list_entry *head, struct list_entry *entry)
Definition: list.h:76
union wined3d_gl_fence_object * free_fences
Definition: wined3d_gl.h:658
struct list fences
Definition: wined3d_gl.h:649
unsigned int free_fence_count
Definition: wined3d_gl.h:660
union wined3d_gl_fence_object object
Definition: wined3d_gl.h:457
struct list entry
Definition: wined3d_gl.h:456
struct wined3d_context_gl * context_gl
Definition: wined3d_gl.h:458

Referenced by wined3d_fence_issue().

◆ wined3d_context_gl_alloc_occlusion_query()

void wined3d_context_gl_alloc_occlusion_query ( struct wined3d_context_gl *  context_gl,
struct wined3d_occlusion_query *  query 
)

Definition at line 877 of file context_gl.c.

879{
880 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
881
882 if (context_gl->free_occlusion_query_count)
883 {
884 query->id = context_gl->free_occlusion_queries[--context_gl->free_occlusion_query_count];
885 }
886 else
887 {
888 if (gl_info->supported[ARB_OCCLUSION_QUERY])
889 {
890 GL_EXTCALL(glGenQueries(1, &query->id));
891 checkGLcall("glGenQueries");
892
893 TRACE("Allocated occlusion query %u in context %p.\n", query->id, context_gl);
894 }
895 else
896 {
897 WARN("Occlusion queries not supported, not allocating query id.\n");
898 query->id = 0;
899 }
900 }
901
902 query->context_gl = context_gl;
903 list_add_head(&context_gl->occlusion_queries, &query->entry);
904}
struct list occlusion_queries
Definition: wined3d_gl.h:648
unsigned int free_occlusion_query_count
Definition: wined3d_gl.h:656
GLuint * free_occlusion_queries
Definition: wined3d_gl.h:654

Referenced by wined3d_occlusion_query_ops_issue().

◆ wined3d_context_gl_alloc_pipeline_statistics_query()

void wined3d_context_gl_alloc_pipeline_statistics_query ( struct wined3d_context_gl *  context_gl,
struct wined3d_pipeline_statistics_query *  query 
)

Definition at line 1065 of file context_gl.c.

1067{
1068 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1069
1071 {
1073 }
1074 else
1075 {
1076 GL_EXTCALL(glGenQueries(ARRAY_SIZE(query->u.id), query->u.id));
1077 checkGLcall("glGenQueries");
1078 }
1079
1080 query->context_gl = context_gl;
1081 list_add_head(&context_gl->pipeline_statistics_queries, &query->entry);
1082}
union wined3d_gl_pipeline_statistics_query * free_pipeline_statistics_queries
Definition: wined3d_gl.h:670
struct list pipeline_statistics_queries
Definition: wined3d_gl.h:652
unsigned int free_pipeline_statistics_query_count
Definition: wined3d_gl.h:672

Referenced by wined3d_pipeline_query_ops_issue().

◆ wined3d_context_gl_alloc_so_statistics_query()

void wined3d_context_gl_alloc_so_statistics_query ( struct wined3d_context_gl *  context_gl,
struct wined3d_so_statistics_query *  query 
)

Definition at line 1024 of file context_gl.c.

1026{
1027 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1028
1029 if (context_gl->free_so_statistics_query_count)
1030 {
1031 query->u = context_gl->free_so_statistics_queries[--context_gl->free_so_statistics_query_count];
1032 }
1033 else
1034 {
1035 GL_EXTCALL(glGenQueries(ARRAY_SIZE(query->u.id), query->u.id));
1036 checkGLcall("glGenQueries");
1037
1038 TRACE("Allocated SO statistics queries %u, %u in context %p.\n",
1039 query->u.id[0], query->u.id[1], context_gl);
1040 }
1041
1042 query->context_gl = context_gl;
1043 list_add_head(&context_gl->so_statistics_queries, &query->entry);
1044}
unsigned int free_so_statistics_query_count
Definition: wined3d_gl.h:668
struct list so_statistics_queries
Definition: wined3d_gl.h:651
union wined3d_gl_so_statistics_query * free_so_statistics_queries
Definition: wined3d_gl.h:666

Referenced by wined3d_so_statistics_query_ops_issue().

◆ wined3d_context_gl_alloc_timestamp_query()

void wined3d_context_gl_alloc_timestamp_query ( struct wined3d_context_gl *  context_gl,
struct wined3d_timestamp_query *  query 
)

Definition at line 985 of file context_gl.c.

987{
988 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
989
990 if (context_gl->free_timestamp_query_count)
991 {
992 query->id = context_gl->free_timestamp_queries[--context_gl->free_timestamp_query_count];
993 }
994 else
995 {
996 GL_EXTCALL(glGenQueries(1, &query->id));
997 checkGLcall("glGenQueries");
998
999 TRACE("Allocated timestamp query %u in context %p.\n", query->id, context_gl);
1000 }
1001
1002 query->context_gl = context_gl;
1003 list_add_head(&context_gl->timestamp_queries, &query->entry);
1004}
GLuint * free_timestamp_queries
Definition: wined3d_gl.h:662
unsigned int free_timestamp_query_count
Definition: wined3d_gl.h:664
struct list timestamp_queries
Definition: wined3d_gl.h:650

Referenced by wined3d_timestamp_query_ops_issue().

◆ wined3d_context_gl_allocate_vram_chunk_buffer()

GLuint wined3d_context_gl_allocate_vram_chunk_buffer ( struct wined3d_context_gl *  context_gl,
unsigned int  pool,
size_t  size 
)

Definition at line 2707 of file context_gl.c.

2709{
2710 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
2712 GLuint id = 0;
2713
2714 TRACE("context_gl %p, pool %u, size %Iu.\n", context_gl, pool, size);
2715
2716 GL_EXTCALL(glGenBuffers(1, &id));
2717 if (!id)
2718 {
2719 checkGLcall("buffer object creation");
2720 return 0;
2721 }
2723
2727 GL_EXTCALL(glBufferStorage(GL_PIXEL_UNPACK_BUFFER, size, NULL, flags));
2728
2729 checkGLcall("buffer object creation");
2730
2731 TRACE("Created buffer object %u.\n", id);
2732
2733 return id;
2734}
void wined3d_context_gl_bind_bo(struct wined3d_context_gl *context_gl, GLenum binding, GLuint name)
Definition: context_gl.c:2497
GLbitfield wined3d_device_gl_get_memory_type_flags(unsigned int memory_type_idx)
Definition: device.c:1274
unsigned int GLbitfield
Definition: gl.h:152
#define GL_MAP_READ_BIT
Definition: glext.h:1793
GLsizeiptr size
Definition: glext.h:5919
GLbitfield flags
Definition: glext.h:7161
#define GL_MAP_WRITE_BIT
Definition: glext.h:1794
GLuint id
Definition: glext.h:5910
#define GL_MAP_COHERENT_BIT
Definition: wgl.h:2142
#define GL_MAP_PERSISTENT_BIT
Definition: wgl.h:2147
#define GL_DYNAMIC_STORAGE_BIT
Definition: wgl.h:1199

Referenced by wined3d_allocator_gl_create_chunk(), wined3d_device_gl_allocate_memory(), and wined3d_device_gl_create_bo().

◆ wined3d_context_gl_apply_blit_state()

void wined3d_context_gl_apply_blit_state ( struct wined3d_context_gl *  context_gl,
const struct wined3d_device *  device 
)

Definition at line 3156 of file context_gl.c.

3157{
3158 struct wined3d_context *context = &context_gl->c;
3159 const struct wined3d_gl_info *gl_info;
3160 SIZE rt_size;
3161
3162 TRACE("Setting up context %p for blitting.\n", context);
3163
3164 gl_info = context_gl->gl_info;
3165
3166 wined3d_context_gl_get_rt_size(context_gl, &rt_size);
3167
3168 if (context->last_was_blit)
3169 {
3170 if (context_gl->blit_size.cx != rt_size.cx || context_gl->blit_size.cy != rt_size.cy)
3171 {
3172 gl_info->gl_ops.gl.p_glViewport(0, 0, rt_size.cx, rt_size.cy);
3173 context->viewport_count = WINED3D_MAX_VIEWPORTS;
3174 context_gl->blit_size = rt_size;
3175 /* No need to dirtify here, the states are still dirtified because
3176 * they weren't applied since the last context_apply_blit_state()
3177 * call. */
3178 }
3179 checkGLcall("blit state application");
3180 TRACE("Context is already set up for blitting, nothing to do.\n");
3181 return;
3182 }
3183 context->last_was_blit = TRUE;
3184
3185 if (gl_info->supported[ARB_SAMPLER_OBJECTS])
3186 GL_EXTCALL(glBindSampler(0, 0));
3187 wined3d_context_gl_active_texture(context_gl, gl_info, 0);
3188
3191
3193 {
3194 gl_info->gl_ops.gl.p_glDisable(GL_ALPHA_TEST);
3196 }
3197 gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
3198 gl_info->gl_ops.gl.p_glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
3200 gl_info->gl_ops.gl.p_glDisable(GL_CULL_FACE);
3201 gl_info->gl_ops.gl.p_glDisable(GL_SCISSOR_TEST);
3203 gl_info->gl_ops.gl.p_glDisable(GL_DEPTH_TEST);
3204 gl_info->gl_ops.gl.p_glDisable(GL_STENCIL_TEST);
3206 if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
3207 {
3208 gl_info->gl_ops.gl.p_glDisable(GL_FRAMEBUFFER_SRGB);
3210 }
3211
3212 context->last_was_rhw = TRUE;
3213 context_invalidate_state(context, STATE_VDECL); /* because of last_was_rhw = TRUE */
3214
3217
3218 /* FIXME: Make draw_textured_quad() able to work with a upper left origin. */
3219 if (gl_info->supported[ARB_CLIP_CONTROL])
3221 gl_info->gl_ops.gl.p_glViewport(0, 0, rt_size.cx, rt_size.cy);
3222 context->viewport_count = WINED3D_MAX_VIEWPORTS;
3224
3225 device->shader_backend->shader_disable(device->shader_priv, context);
3226
3227 context_gl->blit_size = rt_size;
3228
3229 checkGLcall("blit state application");
3230}
void wined3d_context_gl_enable_clip_distances(struct wined3d_context_gl *context_gl, uint32_t enable_mask)
Definition: context_gl.c:2408
static void wined3d_context_gl_get_rt_size(const struct wined3d_context_gl *context_gl, SIZE *size)
Definition: context_gl.c:2387
void wined3d_context_gl_active_texture(struct wined3d_context_gl *context_gl, const struct wined3d_gl_info *gl_info, unsigned int unit)
Definition: context_gl.c:2489
void context_invalidate_compute_state(struct wined3d_context *context, DWORD state_id)
Definition: context.c:66
#define GL_TRUE
Definition: gl.h:174
#define GL_DEPTH_TEST
Definition: gl.h:301
#define GL_STENCIL_TEST
Definition: gl.h:449
#define GL_ALPHA_TEST
Definition: gl.h:366
#define GL_CULL_FACE
Definition: gl.h:276
#define GL_BLEND
Definition: gl.h:371
#define GL_SCISSOR_TEST
Definition: gl.h:589
#define GL_FRAMEBUFFER_SRGB
Definition: glext.h:1758
#define GL_LOWER_LEFT
Definition: glext.h:461
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
#define GL_NEGATIVE_ONE_TO_ONE
Definition: wgl.h:2715
@ WINED3D_RS_SRGBWRITEENABLE
Definition: wined3d.h:400
@ WINED3D_RS_CLIPPING
Definition: wined3d.h:346
@ WINED3D_RS_ALPHATESTENABLE
Definition: wined3d.h:301
#define WINED3D_MAX_VIEWPORTS
Definition: wined3d.h:1590
#define STATE_DEPTH_STENCIL
#define STATE_GRAPHICS_SHADER_RESOURCE_BINDING
#define STATE_COMPUTE_SHADER_RESOURCE_BINDING
#define STATE_RASTERIZER
#define STATE_VDECL
#define STATE_VIEWPORT
#define STATE_RENDER(a)
#define STATE_BLEND

Referenced by glsl_blitter_blit().

◆ wined3d_context_gl_apply_clear_state()

BOOL wined3d_context_gl_apply_clear_state ( struct wined3d_context_gl *  context_gl,
const struct wined3d_state *  state,
unsigned int  rt_count,
const struct wined3d_fb_state *  fb 
)

Definition at line 3250 of file context_gl.c.

3252{
3253 struct wined3d_rendertarget_view * const *rts = fb->render_targets;
3254 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
3255 struct wined3d_rendertarget_view *dsv = fb->depth_stencil;
3256 uint32_t rt_mask = 0, *cur_mask;
3257 unsigned int i;
3258
3259 if (isStateDirty(&context_gl->c, STATE_FRAMEBUFFER) || fb != &state->fb
3260 || rt_count != gl_info->limits.buffers)
3261 {
3262 struct wined3d_rendertarget_info ds_info = {{0}};
3263
3264 if (!have_framebuffer_attachment(rt_count, rts, dsv))
3265 {
3266 WARN("Invalid render target config, need at least one attachment.\n");
3267 return FALSE;
3268 }
3269
3270 if (!rt_count || wined3d_resource_is_offscreen(rts[0]->resource))
3271 {
3272 memset(context_gl->blit_targets, 0, sizeof(context_gl->blit_targets));
3273 for (i = 0; i < rt_count; ++i)
3274 {
3275 if (rts[i])
3276 {
3278 context_gl->blit_targets[i].gl_view = rtv_gl->gl_view;
3279 context_gl->blit_targets[i].resource = rtv_gl->v.resource;
3280 context_gl->blit_targets[i].sub_resource_idx = rtv_gl->v.sub_resource_idx;
3281 context_gl->blit_targets[i].layer_count = rtv_gl->v.layer_count;
3282 }
3283 if (rts[i] && rts[i]->format->id != WINED3DFMT_NULL)
3284 rt_mask |= (1u << i);
3285 }
3286
3287 if (dsv)
3288 {
3290 ds_info.gl_view = dsv_gl->gl_view;
3291 ds_info.resource = dsv_gl->v.resource;
3292 ds_info.sub_resource_idx = dsv_gl->v.sub_resource_idx;
3293 ds_info.layer_count = dsv_gl->v.layer_count;
3294 }
3295
3296 wined3d_context_gl_apply_fbo_state(context_gl, GL_FRAMEBUFFER, context_gl->blit_targets, &ds_info,
3297 rt_count ? rts[0]->resource->draw_binding : 0, dsv ? dsv->resource->draw_binding : 0);
3298 }
3299 else
3300 {
3304 }
3305
3306 /* If the framebuffer is not the device's fb the device's fb has to be reapplied
3307 * next draw. Otherwise we could mark the framebuffer state clean here, once the
3308 * state management allows this */
3310 }
3311 else if (!rt_count || wined3d_resource_is_offscreen(rts[0]->resource))
3312 {
3313 for (i = 0; i < rt_count; ++i)
3314 {
3315 if (rts[i] && rts[i]->format->id != WINED3DFMT_NULL)
3316 rt_mask |= (1u << i);
3317 }
3318 }
3319 else
3320 {
3321 rt_mask = wined3d_context_gl_generate_rt_mask_no_fbo(context_gl, rt_count ? rts[0]->resource : NULL);
3322 }
3323
3324 cur_mask = context_gl->current_fbo ? &context_gl->current_fbo->rt_mask : &context_gl->draw_buffers_mask;
3325
3326 if (rt_mask != *cur_mask)
3327 {
3328 wined3d_context_gl_apply_draw_buffers(context_gl, rt_mask);
3329 *cur_mask = rt_mask;
3331 }
3332
3334
3335 context_gl->c.last_was_blit = FALSE;
3336 context_gl->c.last_was_ffp_blit = FALSE;
3337
3338 /* Blending and clearing should be orthogonal, but tests on the nvidia
3339 * driver show that disabling blending when clearing improves the clearing
3340 * performance incredibly. */
3341 gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
3342 gl_info->gl_ops.gl.p_glEnable(GL_SCISSOR_TEST);
3343 if (rt_count && gl_info->supported[ARB_FRAMEBUFFER_SRGB])
3344 {
3345 if (needs_srgb_write(context_gl->c.d3d_info, state, fb))
3346 gl_info->gl_ops.gl.p_glEnable(GL_FRAMEBUFFER_SRGB);
3347 else
3348 gl_info->gl_ops.gl.p_glDisable(GL_FRAMEBUFFER_SRGB);
3350 }
3351 checkGLcall("setting up state for clear");
3352
3353 context_invalidate_state(&context_gl->c, STATE_BLEND);
3356
3357 return TRUE;
3358}
static uint32_t wined3d_context_gl_generate_rt_mask_no_fbo(const struct wined3d_context_gl *context_gl, struct wined3d_resource *rt)
Definition: context_gl.c:3144
static BOOL have_framebuffer_attachment(unsigned int rt_count, struct wined3d_rendertarget_view *const *rts, const struct wined3d_rendertarget_view *ds)
Definition: context_gl.c:3232
static void wined3d_context_gl_apply_fbo_state(struct wined3d_context_gl *context_gl, GLenum target, const struct wined3d_rendertarget_info *render_targets, const struct wined3d_rendertarget_info *depth_stencil, DWORD color_location, DWORD ds_location)
Definition: context_gl.c:821
#define memset(x, y, z)
Definition: compat.h:39
struct wined3d_rendertarget_info blit_targets[WINED3D_MAX_RENDER_TARGETS]
Definition: wined3d_gl.h:644
struct wined3d_rendertarget_view * depth_stencil
struct wined3d_rendertarget_view * render_targets[WINED3D_MAX_RENDER_TARGETS]
unsigned int layer_count
Definition: wined3d_gl.h:564
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:561
unsigned int sub_resource_idx
Definition: wined3d_gl.h:563
struct wined3d_resource * resource
Definition: wined3d_gl.h:562
struct wined3d_rendertarget_view v
Definition: wined3d_gl.h:1065
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1066
struct wined3d_resource * resource
static bool isStateDirty(const struct wined3d_context *context, unsigned int state_id)
#define STATE_SCISSORRECT
static BOOL needs_srgb_write(const struct wined3d_d3d_info *d3d_info, const struct wined3d_state *state, const struct wined3d_fb_state *fb)

Referenced by ffp_blitter_clear_rendertargets().

◆ wined3d_context_gl_apply_fbo_state_explicit()

void wined3d_context_gl_apply_fbo_state_explicit ( struct wined3d_context_gl *  context_gl,
GLenum  target,
struct wined3d_resource *  rt,
unsigned int  rt_sub_resource_idx,
struct wined3d_resource *  ds,
unsigned int  ds_sub_resource_idx,
uint32_t  location 
)

Definition at line 852 of file context_gl.c.

855{
856 struct wined3d_rendertarget_info ds_info = {{0}};
857
858 memset(context_gl->blit_targets, 0, sizeof(context_gl->blit_targets));
859 if (rt)
860 {
861 context_gl->blit_targets[0].resource = rt;
862 context_gl->blit_targets[0].sub_resource_idx = rt_sub_resource_idx;
863 context_gl->blit_targets[0].layer_count = 1;
864 }
865
866 if (ds)
867 {
868 ds_info.resource = ds;
869 ds_info.sub_resource_idx = ds_sub_resource_idx;
870 ds_info.layer_count = 1;
871 }
872
873 wined3d_context_gl_apply_fbo_state(context_gl, target, context_gl->blit_targets, &ds_info, location, location);
874}
#define ds
Definition: i386-dis.c:443

Referenced by context_gl_apply_texture_draw_state(), texture2d_blt_fbo(), texture2d_depth_blt_fbo(), and texture2d_read_from_framebuffer().

◆ wined3d_context_gl_bind_bo()

◆ wined3d_context_gl_bind_dummy_textures()

void wined3d_context_gl_bind_dummy_textures ( const struct wined3d_context_gl *  context_gl)

Definition at line 1790 of file context_gl.c.

1791{
1792 const struct wined3d_dummy_textures *textures = &wined3d_device_gl(context_gl->c.device)->dummy_textures;
1793 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1794 unsigned int i;
1795
1796 for (i = 0; i < gl_info->limits.combined_samplers; ++i)
1797 {
1799
1800 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_1D, textures->tex_1d);
1801 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, textures->tex_2d);
1802
1803 if (gl_info->supported[EXT_TEXTURE3D])
1804 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_3D, textures->tex_3d);
1805
1806 if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
1807 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_CUBE_MAP, textures->tex_cube);
1808
1810 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures->tex_cube_array);
1811
1812 if (gl_info->supported[EXT_TEXTURE_ARRAY])
1813 {
1814 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_1D_ARRAY, textures->tex_1d_array);
1815 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_ARRAY, textures->tex_2d_array);
1816 }
1817
1819 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_BUFFER, textures->tex_buffer);
1820
1821 if (gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
1822 {
1823 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures->tex_2d_ms);
1824 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures->tex_2d_ms_array);
1825 }
1826 }
1827
1828 checkGLcall("bind dummy textures");
1829}
#define GL_TEXTURE_CUBE_MAP
Definition: gl.h:1788
#define GL_TEXTURE_3D
Definition: gl.h:1515
#define GL_TEXTURE_1D
Definition: gl.h:644
const GLuint * textures
Definition: glext.h:8098
#define GL_TEXTURE_1D_ARRAY
Definition: glext.h:533
#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY
Definition: glext.h:1941
#define GL_TEXTURE_2D_MULTISAMPLE
Definition: glext.h:1939
#define GL_TEXTURE_CUBE_MAP_ARRAY
Definition: glext.h:920
#define GL_TEXTURE_2D_ARRAY
Definition: glext.h:535
struct wined3d_dummy_textures dummy_textures
Definition: wined3d_gl.h:850

Referenced by wined3d_context_gl_init(), and wined3d_device_gl_create_dummy_textures().

◆ wined3d_context_gl_bind_texture()

void wined3d_context_gl_bind_texture ( struct wined3d_context_gl *  context_gl,
GLenum  target,
GLuint  name 
)

Definition at line 2507 of file context_gl.c.

2508{
2509 const struct wined3d_dummy_textures *textures = &wined3d_device_gl(context_gl->c.device)->dummy_textures;
2510 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
2511 GLenum old_texture_type;
2512 unsigned int unit;
2513
2514 if (name)
2515 gl_info->gl_ops.gl.p_glBindTexture(target, name);
2516 else
2517 target = GL_NONE;
2518
2519 unit = context_gl->active_texture;
2520 old_texture_type = context_gl->texture_type[unit];
2521 if (old_texture_type != target)
2522 {
2523 switch (old_texture_type)
2524 {
2525 case GL_NONE:
2526 /* nothing to do */
2527 break;
2528 case GL_TEXTURE_1D:
2529 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_1D, textures->tex_1d);
2530 break;
2532 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_1D_ARRAY, textures->tex_1d_array);
2533 break;
2534 case GL_TEXTURE_2D:
2535 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D, textures->tex_2d);
2536 break;
2538 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_ARRAY, textures->tex_2d_array);
2539 break;
2541 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_CUBE_MAP, textures->tex_cube);
2542 break;
2544 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, textures->tex_cube_array);
2545 break;
2546 case GL_TEXTURE_3D:
2547 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_3D, textures->tex_3d);
2548 break;
2549 case GL_TEXTURE_BUFFER:
2550 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_BUFFER, textures->tex_buffer);
2551 break;
2553 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, textures->tex_2d_ms);
2554 break;
2556 gl_info->gl_ops.gl.p_glBindTexture(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, textures->tex_2d_ms_array);
2557 break;
2558 default:
2559 ERR("Unexpected texture target %#x.\n", old_texture_type);
2560 }
2561
2562 context_gl->texture_type[unit] = target;
2563 }
2564
2565 checkGLcall("bind texture");
2566}
#define GL_NONE
Definition: gl.h:465
GLenum * texture_type
Definition: wined3d_gl.h:623

Referenced by create_buffer_texture(), create_texture_view(), shader_resource_view_gl_bind_and_dirtify(), wined3d_context_gl_bind_shader_resources(), wined3d_context_gl_draw_shaded_quad(), wined3d_shader_resource_view_gl_bind(), and wined3d_texture_gl_bind().

◆ wined3d_context_gl_check_fbo_status()

void wined3d_context_gl_check_fbo_status ( const struct wined3d_context_gl *  context_gl,
GLenum  target 
)

Definition at line 419 of file context_gl.c.

420{
421 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
423
424 if (!FIXME_ON(d3d))
425 return;
426
427 status = gl_info->fbo_ops.glCheckFramebufferStatus(target);
429 {
430 TRACE("FBO complete.\n");
431 }
432 else
433 {
434 unsigned int i;
435
436 FIXME("FBO status %s (%#x).\n", debug_fbostatus(status), status);
437
438 if (!context_gl->current_fbo)
439 {
440 ERR("FBO 0 is incomplete, driver bug?\n");
441 return;
442 }
443
446
447 for (i = 0; i < gl_info->limits.buffers; ++i)
449 }
450}
static void context_dump_fbo_attachment(const struct wined3d_gl_info *gl_info, GLenum target, GLenum attachment)
Definition: context_gl.c:283
const char * debug_fbostatus(GLenum status)
Definition: utils.c:5423

Referenced by context_apply_draw_state(), context_gl_apply_texture_draw_state(), texture2d_blt_fbo(), texture2d_depth_blt_fbo(), texture2d_read_from_framebuffer(), and wined3d_context_gl_apply_clear_state().

◆ wined3d_context_gl_const()

static const struct wined3d_context_gl * wined3d_context_gl_const ( const struct wined3d_context *  context)
inlinestatic

Definition at line 699 of file wined3d_gl.h.

700{
702}

Referenced by shader_glsl_load_samplers(), and shader_glsl_map_tex_unit().

◆ wined3d_context_gl_copy_bo_address()

void wined3d_context_gl_copy_bo_address ( struct wined3d_context_gl *  context_gl,
const struct wined3d_bo_address *  dst,
const struct wined3d_bo_address *  src,
unsigned int  range_count,
const struct wined3d_range *  ranges,
uint32_t  map_flags 
)

Definition at line 3016 of file context_gl.c.

3019{
3020 const struct wined3d_gl_info *gl_info;
3021 struct wined3d_bo_gl *src_bo, *dst_bo;
3022 BYTE *dst_ptr, *src_ptr;
3023 unsigned int i;
3024
3025 gl_info = context_gl->gl_info;
3026 src_bo = src->buffer_object ? wined3d_bo_gl(src->buffer_object) : NULL;
3027 dst_bo = dst->buffer_object ? wined3d_bo_gl(dst->buffer_object) : NULL;
3028
3029 if (dst_bo && src_bo)
3030 {
3031 if (gl_info->supported[ARB_COPY_BUFFER])
3032 {
3033 GL_EXTCALL(glBindBuffer(GL_COPY_READ_BUFFER, src_bo->id));
3034 GL_EXTCALL(glBindBuffer(GL_COPY_WRITE_BUFFER, dst_bo->id));
3035
3036 for (i = 0; i < range_count; ++i)
3038 src_bo->b.buffer_offset + (GLintptr)src->addr + ranges[i].offset,
3039 dst_bo->b.buffer_offset + (GLintptr)dst->addr + ranges[i].offset, ranges[i].size));
3040 checkGLcall("direct buffer copy");
3041
3042 wined3d_context_gl_reference_bo(context_gl, src_bo);
3043 wined3d_context_gl_reference_bo(context_gl, dst_bo);
3044 }
3045 else
3046 {
3047 src_ptr = wined3d_context_gl_map_bo_address(context_gl, src,
3048 src_bo->size - (uintptr_t)src->addr, WINED3D_MAP_READ);
3049 dst_ptr = wined3d_context_gl_map_bo_address(context_gl, dst,
3050 dst_bo->size - (uintptr_t)dst->addr, map_flags);
3051
3052 for (i = 0; i < range_count; ++i)
3053 memcpy(dst_ptr + ranges[i].offset, src_ptr + ranges[i].offset, ranges[i].size);
3054
3055 wined3d_context_gl_unmap_bo_address(context_gl, dst, range_count, ranges);
3057 }
3058 }
3059 else if (!dst_bo && src_bo)
3060 {
3061 wined3d_context_gl_bind_bo(context_gl, src_bo->binding, src_bo->id);
3062 for (i = 0; i < range_count; ++i)
3063 GL_EXTCALL(glGetBufferSubData(src_bo->binding,
3064 src_bo->b.buffer_offset + (GLintptr)src->addr + ranges[i].offset,
3065 ranges[i].size, dst->addr + ranges[i].offset));
3066 checkGLcall("buffer download");
3067
3068 wined3d_context_gl_reference_bo(context_gl, src_bo);
3069 }
3070 else if (dst_bo && !src_bo)
3071 {
3072 if ((map_flags & WINED3D_MAP_DISCARD) && (dst_bo->flags & GL_MAP_WRITE_BIT))
3073 {
3074 dst_ptr = wined3d_context_gl_map_bo_address(context_gl, dst, dst_bo->size, map_flags);
3075 memcpy(dst_ptr, src->addr, dst_bo->size);
3076 wined3d_context_gl_unmap_bo_address(context_gl, dst, range_count, ranges);
3077 }
3078 else
3079 {
3080 wined3d_context_gl_bind_bo(context_gl, dst_bo->binding, dst_bo->id);
3081 for (i = 0; i < range_count; ++i)
3082 GL_EXTCALL(glBufferSubData(dst_bo->binding,
3083 dst_bo->b.buffer_offset + (GLintptr)dst->addr + ranges[i].offset,
3084 ranges[i].size, src->addr + ranges[i].offset));
3085 checkGLcall("buffer upload");
3086
3087 wined3d_context_gl_reference_bo(context_gl, dst_bo);
3088 }
3089 }
3090 else
3091 {
3092 for (i = 0; i < range_count; ++i)
3093 memcpy(dst->addr + ranges[i].offset, src->addr + ranges[i].offset, ranges[i].size);
3094 }
3095}
void wined3d_context_gl_unmap_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
Definition: context_gl.c:2988
void * wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, size_t size, uint32_t flags)
Definition: context_gl.c:2932
#define GL_COPY_WRITE_BUFFER
Definition: glext.h:1889
GLenum src
Definition: glext.h:6340
ptrdiff_t GLintptr
Definition: glext.h:5498
GLenum GLenum dst
Definition: glext.h:6340
#define GL_COPY_READ_BUFFER
Definition: glext.h:1887
GLenum binding
Definition: wined3d_gl.h:422
GLsizeiptr size
Definition: wined3d_gl.h:421
GLbitfield flags
Definition: wined3d_gl.h:425
struct wined3d_bo b
Definition: wined3d_gl.h:415
#define WINED3D_MAP_READ
Definition: wined3d.h:957
#define WINED3D_MAP_DISCARD
Definition: wined3d.h:953

Referenced by adapter_gl_copy_bo_address().

◆ wined3d_context_gl_destroy()

void wined3d_context_gl_destroy ( struct wined3d_context_gl *  context_gl)

Definition at line 2308 of file context_gl.c.

2309{
2310 struct wined3d_device *device = context_gl->c.device;
2311
2312 TRACE("Destroying context %p.\n", context_gl);
2313
2315
2316 /* We delay destroying a context when it is active. The context_release()
2317 * function invokes wined3d_context_gl_destroy() again while leaving the
2318 * last level. */
2319 if (context_gl->level)
2320 {
2321 TRACE("Delaying destruction of context %p.\n", context_gl);
2322 context_gl->c.destroy_delayed = 1;
2323 /* FIXME: Get rid of a pointer to swapchain from wined3d_context. */
2324 context_gl->c.swapchain = NULL;
2325 context_gl->c.device = NULL;
2326 return;
2327 }
2328
2329 device_context_remove(device, &context_gl->c);
2330
2331 if (context_gl->c.current && context_gl->tid != GetCurrentThreadId())
2332 {
2333 struct wined3d_gl_info *gl_info;
2334
2335 /* Make a copy of gl_info for wined3d_context_gl_cleanup() use, the
2336 * one in wined3d_adapter may go away in the meantime. */
2337 gl_info = malloc(sizeof(*gl_info));
2338 *gl_info = *context_gl->gl_info;
2339 context_gl->gl_info = gl_info;
2340 context_gl->c.destroyed = 1;
2341
2342 return;
2343 }
2344
2345 wined3d_context_gl_cleanup(context_gl);
2347 free(context_gl);
2348}
static void wined3d_context_gl_cleanup(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1361
DWORD context_get_tls_idx(void)
Definition: context_gl.c:1556
void device_context_remove(struct wined3d_device *device, struct wined3d_context *context)
Definition: device.c:118
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1334
unsigned int level
Definition: wined3d_gl.h:626
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459
static void wined3d_from_cs(const struct wined3d_cs *cs)

Referenced by wined3d_context_gl_release(), wined3d_device_gl_create_primary_opengl_context_cs(), wined3d_device_gl_delete_opengl_contexts_cs(), and wined3d_swapchain_gl_create_context().

◆ wined3d_context_gl_destroy_bo()

void wined3d_context_gl_destroy_bo ( struct wined3d_context_gl *  context_gl,
struct wined3d_bo_gl *  bo 
)

Definition at line 3097 of file context_gl.c.

3098{
3099 struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
3100 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
3101
3102 TRACE("context_gl %p, bo %p.\n", context_gl, bo);
3103
3104 assert(list_empty(&bo->b.users));
3105
3106 if (bo->memory)
3107 {
3108 unsigned int order = bo->memory->order;
3109
3110 if (bo->b.map_ptr)
3113
3114 if (bo->command_fence_id == device_gl->current_fence_id)
3115 {
3119 }
3120
3121 bo->id = 0;
3122 return;
3123 }
3124
3125 if (bo->b.map_ptr)
3126 {
3127 wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
3128 GL_EXTCALL(glUnmapBuffer(bo->binding));
3129 adapter_adjust_mapped_memory(context_gl->c.device->adapter, -bo->size);
3130 }
3131
3132 TRACE("Destroying GL buffer %u.\n", bo->id);
3133
3134 GL_EXTCALL(glDeleteBuffers(1, &bo->id));
3135 checkGLcall("buffer object destruction");
3136 bo->id = 0;
3137}
static int list_empty(struct list_entry *head)
Definition: list.h:58
static void wined3d_context_gl_destroy_allocator_block(struct wined3d_context_gl *context_gl, struct wined3d_allocator_block *block, uint64_t fence_id)
Definition: context_gl.c:2680
static void wined3d_allocator_chunk_gl_unmap(struct wined3d_allocator_chunk_gl *chunk_gl, struct wined3d_context_gl *context_gl)
Definition: context_gl.c:2776
void wined3d_context_gl_submit_command_fence(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:2653
#define assert(_expr)
Definition: assert.h:32
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
struct wined3d_allocator_block * memory
Definition: wined3d_gl.h:419
uint64_t command_fence_id
Definition: wined3d_gl.h:426
uint64_t current_fence_id
Definition: wined3d_gl.h:855
uint64_t retired_bo_size
Definition: wined3d_gl.h:856
ssize_t adapter_adjust_mapped_memory(struct wined3d_adapter *adapter, ssize_t size)
Definition: directx.c:167
#define WINED3D_ALLOCATOR_CHUNK_SIZE
#define WINED3D_RETIRED_BO_SIZE_THRESHOLD

Referenced by adapter_gl_destroy_bo(), wined3d_bo_gl_map(), wined3d_buffer_gl_destroy_buffer_object(), wined3d_texture_remove_buffer_object(), and wined3d_view_gl_destroy_object().

◆ wined3d_context_gl_draw_shaded_quad()

void wined3d_context_gl_draw_shaded_quad ( struct wined3d_context_gl *  context_gl,
struct wined3d_texture_gl *  texture_gl,
unsigned int  sub_resource_idx,
const RECT *  src_rect,
const RECT *  dst_rect,
enum wined3d_texture_filter_type  filter 
)

Definition at line 5125 of file context_gl.c.

5128{
5129 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
5130 struct wined3d_blt_info info;
5131 unsigned int level, w, h, i;
5132 SIZE dst_size;
5133 struct blit_vertex
5134 {
5135 float x, y;
5136 struct wined3d_vec3 texcoord;
5137 }
5138 quad[4];
5139
5140 texture2d_get_blt_info(texture_gl, sub_resource_idx, src_rect, &info);
5141
5142 level = sub_resource_idx % texture_gl->t.level_count;
5143 wined3d_context_gl_bind_texture(context_gl, info.bind_target, texture_gl->texture_rgb.name);
5144 apply_texture_blit_state(gl_info, &texture_gl->texture_rgb, info.bind_target, level, filter);
5145 gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, level);
5146
5148
5149 wined3d_context_gl_get_rt_size(context_gl, &dst_size);
5150 w = dst_size.cx;
5151 h = dst_size.cy;
5152
5153 quad[0].x = dst_rect->left * 2.0f / w - 1.0f;
5154 quad[0].y = dst_rect->top * 2.0f / h - 1.0f;
5155 quad[0].texcoord = info.texcoords[0];
5156
5157 quad[1].x = dst_rect->right * 2.0f / w - 1.0f;
5158 quad[1].y = dst_rect->top * 2.0f / h - 1.0f;
5159 quad[1].texcoord = info.texcoords[1];
5160
5161 quad[2].x = dst_rect->left * 2.0f / w - 1.0f;
5162 quad[2].y = dst_rect->bottom * 2.0f / h - 1.0f;
5163 quad[2].texcoord = info.texcoords[2];
5164
5165 quad[3].x = dst_rect->right * 2.0f / w - 1.0f;
5166 quad[3].y = dst_rect->bottom * 2.0f / h - 1.0f;
5167 quad[3].texcoord = info.texcoords[3];
5168
5169 /* Draw a quad. */
5170 if (gl_info->supported[ARB_VERTEX_BUFFER_OBJECT])
5171 {
5172 if (!context_gl->blit_vbo)
5173 GL_EXTCALL(glGenBuffers(1, &context_gl->blit_vbo));
5174 GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, context_gl->blit_vbo));
5175
5177
5178 GL_EXTCALL(glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STREAM_DRAW));
5179 GL_EXTCALL(glVertexAttribPointer(0, 2, GL_FLOAT, FALSE, sizeof(*quad), NULL));
5180 GL_EXTCALL(glVertexAttribPointer(1, 3, GL_FLOAT, FALSE, sizeof(*quad),
5181 (void *)FIELD_OFFSET(struct blit_vertex, texcoord)));
5182
5183 GL_EXTCALL(glEnableVertexAttribArray(0));
5184 GL_EXTCALL(glEnableVertexAttribArray(1));
5185
5186 gl_info->gl_ops.gl.p_glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
5187
5188 GL_EXTCALL(glBindBuffer(GL_ARRAY_BUFFER, 0));
5189 GL_EXTCALL(glDisableVertexAttribArray(1));
5190 GL_EXTCALL(glDisableVertexAttribArray(0));
5191 }
5192 else
5193 {
5194 gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
5195
5196 for (i = 0; i < ARRAY_SIZE(quad); ++i)
5197 {
5198 GL_EXTCALL(glVertexAttrib3fv(1, &quad[i].texcoord.x));
5199 GL_EXTCALL(glVertexAttrib2fv(0, &quad[i].x));
5200 }
5201
5202 gl_info->gl_ops.gl.p_glEnd();
5203 }
5204 checkGLcall("draw");
5205
5206 gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
5207 wined3d_context_gl_bind_texture(context_gl, info.bind_target, 0);
5208}
static void wined3d_context_gl_unload_numbered_arrays(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:4873
static void apply_texture_blit_state(const struct wined3d_gl_info *gl_info, struct gl_texture *texture, GLenum target, unsigned int level, enum wined3d_texture_filter_type filter)
Definition: context_gl.c:5101
static void wined3d_context_gl_pause_transform_feedback(struct wined3d_context_gl *context_gl, BOOL force)
Definition: context_gl.c:4241
void wined3d_context_gl_bind_texture(struct wined3d_context_gl *context_gl, GLenum target, GLuint name)
Definition: context_gl.c:2507
void texture2d_get_blt_info(const struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx, const RECT *rect, struct wined3d_blt_info *info)
Definition: texture.c:173
#define GL_FLOAT
Definition: gl.h:183
#define GL_TRIANGLE_STRIP
Definition: gl.h:195
#define GL_STREAM_DRAW
Definition: glext.h:347
static void quad(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3, GLuint pv)
Definition: quads.c:63
Definition: filter.c:165
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255

Referenced by glsl_blitter_blit().

◆ wined3d_context_gl_enable_clip_distances()

void wined3d_context_gl_enable_clip_distances ( struct wined3d_context_gl *  context_gl,
uint32_t  mask 
)

Definition at line 2408 of file context_gl.c.

2409{
2410 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
2411 unsigned int clip_distance_count, i;
2412 uint32_t disable_mask, current_mask;
2413
2414 clip_distance_count = gl_info->limits.user_clip_distances;
2415 disable_mask = ~enable_mask;
2416 enable_mask &= wined3d_mask_from_size(clip_distance_count);
2417 disable_mask &= wined3d_mask_from_size(clip_distance_count);
2418 current_mask = context_gl->c.clip_distance_mask;
2419 context_gl->c.clip_distance_mask = enable_mask;
2420
2421 enable_mask &= ~current_mask;
2422 while (enable_mask)
2423 {
2424 i = wined3d_bit_scan(&enable_mask);
2425 gl_info->gl_ops.gl.p_glEnable(GL_CLIP_DISTANCE0 + i);
2426 }
2427 disable_mask &= current_mask;
2428 while (disable_mask)
2429 {
2430 i = wined3d_bit_scan(&disable_mask);
2431 gl_info->gl_ops.gl.p_glDisable(GL_CLIP_DISTANCE0 + i);
2432 }
2433 checkGLcall("toggle clip distances");
2434}
#define GL_CLIP_DISTANCE0
Definition: glext.h:506
static int wined3d_bit_scan(unsigned int *x)
Definition: wined3d.h:2982
static uint32_t wined3d_mask_from_size(unsigned int size)

Referenced by shader_glsl_update_graphics_program(), state_clipping(), and wined3d_context_gl_apply_blit_state().

◆ wined3d_context_gl_end_transform_feedback()

void wined3d_context_gl_end_transform_feedback ( struct wined3d_context_gl *  context_gl)

Definition at line 4228 of file context_gl.c.

4229{
4230 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
4231
4232 if (context_gl->c.transform_feedback_active)
4233 {
4234 GL_EXTCALL(glEndTransformFeedback());
4235 checkGLcall("glEndTransformFeedback");
4236 context_gl->c.transform_feedback_active = 0;
4237 context_gl->c.transform_feedback_paused = 0;
4238 }
4239}

Referenced by state_so(), wined3d_buffer_gl_destroy_buffer_object(), and wined3d_context_gl_pause_transform_feedback().

◆ wined3d_context_gl_flush_bo_address()

void wined3d_context_gl_flush_bo_address ( struct wined3d_context_gl *  context_gl,
const struct wined3d_const_bo_address *  data,
size_t  size 
)

Definition at line 3003 of file context_gl.c.

3005{
3006 struct wined3d_range range;
3007
3008 TRACE("context_gl %p, data %s, size %Iu.\n", context_gl, debug_const_bo_address(data), size);
3009
3010 range.offset = (uintptr_t)data->addr;
3011 range.size = size;
3012
3013 flush_bo_ranges(context_gl, data, 1, &range);
3014}
static void flush_bo_ranges(struct wined3d_context_gl *context_gl, const struct wined3d_const_bo_address *data, unsigned int range_count, const struct wined3d_range *ranges)
Definition: context_gl.c:2950
range
Definition: d3dx9_private.h:58
const char * debug_const_bo_address(const struct wined3d_const_bo_address *address)
Definition: utils.c:4593

Referenced by adapter_gl_flush_bo_address().

◆ wined3d_context_gl_free_fence()

void wined3d_context_gl_free_fence ( struct wined3d_fence *  fence)

Definition at line 966 of file context_gl.c.

967{
968 struct wined3d_context_gl *context_gl = fence->context_gl;
969
970 list_remove(&fence->entry);
971 fence->context_gl = NULL;
972
973 if (!wined3d_array_reserve((void **)&context_gl->free_fences,
974 &context_gl->free_fence_size, context_gl->free_fence_count + 1,
975 sizeof(*context_gl->free_fences)))
976 {
977 ERR("Failed to grow free list, leaking fence %u in context %p.\n", fence->object.id, context_gl);
978 return;
979 }
980
981 context_gl->free_fences[context_gl->free_fence_count++] = fence->object;
982}
static void list_remove(struct list_entry *entry)
Definition: list.h:90
BOOL wined3d_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
Definition: utils.c:6740
SIZE_T free_fence_size
Definition: wined3d_gl.h:659

Referenced by wined3d_fence_free(), and wined3d_fence_issue().

◆ wined3d_context_gl_free_occlusion_query()

void wined3d_context_gl_free_occlusion_query ( struct wined3d_occlusion_query *  query)

Definition at line 906 of file context_gl.c.

907{
908 struct wined3d_context_gl *context_gl = query->context_gl;
909
910 list_remove(&query->entry);
911 query->context_gl = NULL;
912
913 if (!wined3d_array_reserve((void **)&context_gl->free_occlusion_queries,
914 &context_gl->free_occlusion_query_size, context_gl->free_occlusion_query_count + 1,
915 sizeof(*context_gl->free_occlusion_queries)))
916 {
917 ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context_gl);
918 return;
919 }
920
921 context_gl->free_occlusion_queries[context_gl->free_occlusion_query_count++] = query->id;
922}
SIZE_T free_occlusion_query_size
Definition: wined3d_gl.h:655

Referenced by wined3d_occlusion_query_ops_destroy(), and wined3d_occlusion_query_ops_issue().

◆ wined3d_context_gl_free_pipeline_statistics_query()

void wined3d_context_gl_free_pipeline_statistics_query ( struct wined3d_pipeline_statistics_query *  query)

Definition at line 1084 of file context_gl.c.

1085{
1086 struct wined3d_context_gl *context_gl = query->context_gl;
1087
1088 list_remove(&query->entry);
1089 query->context_gl = NULL;
1090
1093 sizeof(*context_gl->free_pipeline_statistics_queries)))
1094 {
1095 ERR("Failed to grow free list, leaking GL queries in context %p.\n", context_gl);
1096 return;
1097 }
1098
1100}
SIZE_T free_pipeline_statistics_query_size
Definition: wined3d_gl.h:671

Referenced by wined3d_pipeline_query_ops_destroy(), and wined3d_pipeline_query_ops_issue().

◆ wined3d_context_gl_free_so_statistics_query()

void wined3d_context_gl_free_so_statistics_query ( struct wined3d_so_statistics_query *  query)

Definition at line 1046 of file context_gl.c.

1047{
1048 struct wined3d_context_gl *context_gl = query->context_gl;
1049
1050 list_remove(&query->entry);
1051 query->context_gl = NULL;
1052
1053 if (!wined3d_array_reserve((void **)&context_gl->free_so_statistics_queries,
1055 sizeof(*context_gl->free_so_statistics_queries)))
1056 {
1057 ERR("Failed to grow free list, leaking GL queries %u, %u in context %p.\n",
1058 query->u.id[0], query->u.id[1], context_gl);
1059 return;
1060 }
1061
1062 context_gl->free_so_statistics_queries[context_gl->free_so_statistics_query_count++] = query->u;
1063}
SIZE_T free_so_statistics_query_size
Definition: wined3d_gl.h:667

Referenced by wined3d_so_statistics_query_ops_destroy(), and wined3d_so_statistics_query_ops_issue().

◆ wined3d_context_gl_free_timestamp_query()

void wined3d_context_gl_free_timestamp_query ( struct wined3d_timestamp_query *  query)

Definition at line 1006 of file context_gl.c.

1007{
1008 struct wined3d_context_gl *context_gl = query->context_gl;
1009
1010 list_remove(&query->entry);
1011 query->context_gl = NULL;
1012
1013 if (!wined3d_array_reserve((void **)&context_gl->free_timestamp_queries,
1014 &context_gl->free_timestamp_query_size, context_gl->free_timestamp_query_count + 1,
1015 sizeof(*context_gl->free_timestamp_queries)))
1016 {
1017 ERR("Failed to grow free list, leaking query %u in context %p.\n", query->id, context_gl);
1018 return;
1019 }
1020
1021 context_gl->free_timestamp_queries[context_gl->free_timestamp_query_count++] = query->id;
1022}
SIZE_T free_timestamp_query_size
Definition: wined3d_gl.h:663

Referenced by wined3d_timestamp_query_ops_destroy(), and wined3d_timestamp_query_ops_issue().

◆ wined3d_context_gl_get_current()

◆ wined3d_context_gl_get_offscreen_gl_buffer()

GLenum wined3d_context_gl_get_offscreen_gl_buffer ( const struct wined3d_context_gl *  context_gl)

Definition at line 3139 of file context_gl.c.

3140{
3141 return GL_COLOR_ATTACHMENT0;
3142}

Referenced by texture2d_read_from_framebuffer(), and wined3d_context_gl_generate_rt_mask_no_fbo().

◆ wined3d_context_gl_get_tex_unit_mapping()

const unsigned int * wined3d_context_gl_get_tex_unit_mapping ( const struct wined3d_context_gl *  context_gl,
const struct wined3d_shader_version *  shader_version,
unsigned int *  base,
unsigned int *  count 
)

Definition at line 2350 of file context_gl.c.

2352{
2353 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
2354
2355 if (!shader_version)
2356 {
2357 *base = 0;
2359 return context_gl->tex_unit_map;
2360 }
2361
2362 if (shader_version->major >= 4)
2363 {
2364 wined3d_gl_limits_get_texture_unit_range(&gl_info->limits, shader_version->type, base, count);
2365 return NULL;
2366 }
2367
2368 switch (shader_version->type)
2369 {
2371 *base = 0;
2373 break;
2377 break;
2378 default:
2379 ERR("Unhandled shader type %#x.\n", shader_version->type);
2380 *base = 0;
2381 *count = 0;
2382 }
2383
2384 return context_gl->tex_unit_map;
2385}
void wined3d_gl_limits_get_texture_unit_range(const struct wined3d_gl_limits *gl_limits, enum wined3d_shader_type shader_type, unsigned int *base, unsigned int *count)
Definition: utils.c:6712
GLuint GLuint GLsizei count
Definition: gl.h:1545
unsigned int tex_unit_map[WINED3D_MAX_COMBINED_SAMPLERS]
Definition: wined3d_gl.h:676
enum wined3d_shader_type type
#define WINED3D_MAX_FRAGMENT_SAMPLERS
Definition: wined3d.h:1598
@ WINED3D_SHADER_TYPE_PIXEL
Definition: wined3d.h:841
@ WINED3D_SHADER_TYPE_VERTEX
Definition: wined3d.h:842
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
#define WINED3D_MAX_VERTEX_SAMPLERS
Definition: wined3d.h:1599

Referenced by create_combined_resource_sampler_bindings(), shader_glsl_load_samplers(), shader_glsl_map_tex_unit(), and wined3d_context_gl_bind_shader_resources().

◆ wined3d_context_gl_init()

HRESULT wined3d_context_gl_init ( struct wined3d_context_gl *  context_gl,
struct wined3d_swapchain_gl *  swapchain_gl 
)

Definition at line 2032 of file context_gl.c.

2033{
2034 struct wined3d_context *context = &context_gl->c;
2035 const struct wined3d_d3d_info *d3d_info;
2036 const struct wined3d_gl_info *gl_info;
2037 struct wined3d_device *device;
2038 BOOL new_drawable;
2039 unsigned int i;
2040
2041 TRACE("context_gl %p, swapchain %p.\n", context_gl, swapchain_gl);
2042
2043 wined3d_context_init(&context_gl->c, &swapchain_gl->s);
2044
2045 device = context->device;
2046 gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
2047 context_gl->gl_info = gl_info;
2048 d3d_info = context->d3d_info;
2049
2050 context_gl->tid = GetCurrentThreadId();
2051 context_gl->window = context->swapchain->win_handle;
2052 if (context_gl->window == GetDesktopWindow())
2053 {
2054 TRACE("Swapchain is created on the desktop window, trying backup device context.\n");
2055 context_gl->dc = NULL;
2056 }
2057 else if (!(context_gl->dc = GetDCEx(context_gl->window, 0, DCX_USESTYLE | DCX_CACHE)))
2058 WARN("Failed to retrieve device context, trying swapchain backup.\n");
2059
2060 if (!context_gl->dc)
2061 {
2063 {
2064 ERR("Failed to retrieve a device context.\n");
2065 return E_FAIL;
2066 }
2067 context_gl->dc_is_private = TRUE;
2068 }
2069
2070 list_init(&context_gl->fbo_list);
2071 list_init(&context_gl->fbo_destroy_list);
2072
2073 list_init(&context_gl->occlusion_queries);
2074 list_init(&context_gl->fences);
2075 list_init(&context_gl->timestamp_queries);
2076 list_init(&context_gl->so_statistics_queries);
2078
2079 for (i = 0; i < ARRAY_SIZE(context_gl->tex_unit_map); ++i)
2080 context_gl->tex_unit_map[i] = WINED3D_UNMAPPED_STAGE;
2081 for (i = 0; i < ARRAY_SIZE(context_gl->rev_tex_unit_map); ++i)
2083 if (gl_info->limits.graphics_samplers >= WINED3D_MAX_COMBINED_SAMPLERS)
2084 {
2085 /* Initialize the texture unit mapping to a 1:1 mapping. */
2086 unsigned int base, count;
2087
2090 {
2091 ERR("Unexpected texture unit base index %u.\n", base);
2092 goto fail;
2093 }
2094 for (i = 0; i < min(count, WINED3D_MAX_FRAGMENT_SAMPLERS); ++i)
2095 {
2096 context_gl->tex_unit_map[i] = base + i;
2097 context_gl->rev_tex_unit_map[base + i] = i;
2098 }
2099
2102 {
2103 ERR("Unexpected texture unit base index %u.\n", base);
2104 goto fail;
2105 }
2106 for (i = 0; i < min(count, WINED3D_MAX_VERTEX_SAMPLERS); ++i)
2107 {
2110 }
2111 }
2112
2113 if (!(context_gl->texture_type = calloc(gl_info->limits.combined_samplers,
2114 sizeof(*context_gl->texture_type))))
2115 goto fail;
2116
2117 if (!wined3d_context_gl_create_wgl_ctx(context_gl, swapchain_gl, &new_drawable))
2118 goto fail;
2119
2120 /* Set up the context defaults. */
2121
2123
2124 if (!wined3d_context_gl_set_current(context_gl))
2125 {
2126 ERR("Cannot activate context to set up defaults.\n");
2128 if (!wglDeleteContext(context_gl->gl_ctx))
2129 ERR("wglDeleteContext(%p) failed, last error %#lx.\n", context_gl->gl_ctx, GetLastError());
2130 goto fail;
2131 }
2132
2133 if (context_debug_output_enabled(gl_info))
2134 {
2135 GL_EXTCALL(glDebugMessageCallback(wined3d_debug_callback, context));
2136 if (TRACE_ON(d3d_sync))
2137 gl_info->gl_ops.gl.p_glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
2138 GL_EXTCALL(glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_FALSE));
2139 if (ERR_ON(d3d))
2140 {
2141 GL_EXTCALL(glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_ERROR,
2142 GL_DONT_CARE, 0, NULL, GL_TRUE));
2143 }
2144 if (FIXME_ON(d3d))
2145 {
2147 GL_DONT_CARE, 0, NULL, GL_TRUE));
2149 GL_DONT_CARE, 0, NULL, GL_TRUE));
2150 GL_EXTCALL(glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_PORTABILITY,
2151 GL_DONT_CARE, 0, NULL, GL_TRUE));
2152 }
2153 if (WARN_ON(d3d_perf))
2154 {
2155 GL_EXTCALL(glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_PERFORMANCE,
2156 GL_DONT_CARE, 0, NULL, GL_TRUE));
2157 }
2158 }
2159
2161 gl_info->gl_ops.gl.p_glGetIntegerv(GL_AUX_BUFFERS, &context_gl->aux_buffers);
2162
2163 TRACE("Setting up the screen\n");
2164
2166 {
2167 gl_info->gl_ops.gl.p_glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
2168 checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);");
2169
2170 gl_info->gl_ops.gl.p_glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
2171 checkGLcall("glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);");
2172
2174 checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);");
2175 }
2176 else
2177 {
2178 GLuint vao;
2179
2180 GL_EXTCALL(glGenVertexArrays(1, &vao));
2181 GL_EXTCALL(glBindVertexArray(vao));
2182 checkGLcall("creating VAO");
2183 }
2184
2185 gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);
2186 checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);");
2187 gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
2188 checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, 1);");
2189
2190 if (gl_info->supported[NV_TEXTURE_SHADER2])
2191 {
2192 /* Set up the previous texture input for all shader units. This applies to bump mapping, and in d3d
2193 * the previous texture where to source the offset from is always unit - 1.
2194 */
2195 for (i = 1; i < gl_info->limits.ffp_textures; ++i)
2196 {
2197 wined3d_context_gl_active_texture(context_gl, gl_info, i);
2198 gl_info->gl_ops.gl.p_glTexEnvi(GL_TEXTURE_SHADER_NV,
2200 checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, ...");
2201 }
2202 }
2203 if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
2204 {
2205 /* MacOS(radeon X1600 at least, but most likely others too) refuses to draw if GLSL and ARBFP are
2206 * enabled, but the currently bound arbfp program is 0. Enabling ARBFP with prog 0 is invalid, but
2207 * GLSL should bypass this. This causes problems in programs that never use the fixed function pipeline,
2208 * because the ARBFP extension is enabled by the ARBFP pipeline at context creation, but no program
2209 * is ever assigned.
2210 *
2211 * So make sure a program is assigned to each context. The first real ARBFP use will set a different
2212 * program and the dummy program is destroyed when the context is destroyed.
2213 */
2214 static const char dummy_program[] =
2215 "!!ARBfp1.0\n"
2216 "MOV result.color, fragment.color.primary;\n"
2217 "END\n";
2218 GL_EXTCALL(glGenProgramsARB(1, &context_gl->dummy_arbfp_prog));
2219 GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, context_gl->dummy_arbfp_prog));
2220 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB,
2221 GL_PROGRAM_FORMAT_ASCII_ARB, strlen(dummy_program), dummy_program));
2222 }
2223
2224 if (gl_info->supported[ARB_POINT_SPRITE])
2225 {
2226 /* The actual effect of D3DRS_POINTSPRITEENABLE is more accurately
2227 * congruent to GL_COORD_REPLACE_ARB. GL_POINT_SPRITE_ARB, when
2228 * disabled, affects point rasterization (which we do not want),
2229 * implicitly disables GL_COORD_REPLACE_ARB, and causes gl_PointCoord
2230 * to return an undefined value.
2231 *
2232 * We implement D3DRS_POINTSPRITEENABLE by altering the shader to read
2233 * from gl_PointCoord or from the actual texcoord, so we do not need
2234 * GL_COORD_REPLACE_ARB, nor do we need to dynamically toggle
2235 * GL_POINT_SPRITE_ARB. */
2236
2237 gl_info->gl_ops.gl.p_glEnable(GL_POINT_SPRITE_ARB);
2238
2239 for (i = 0; i < gl_info->limits.ffp_textures; ++i)
2240 {
2241 wined3d_context_gl_active_texture(context_gl, gl_info, i);
2242 gl_info->gl_ops.gl.p_glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
2243 checkGLcall("glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE)");
2244 }
2245 }
2246
2247 if (!gl_info->supported[ARB_CLIP_CONTROL] && gl_info->supported[WINED3D_GL_VERSION_2_0])
2248 {
2250 checkGLcall("glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN, GL_LOWER_LEFT)");
2251 }
2252
2253 if (gl_info->supported[ARB_PROVOKING_VERTEX])
2254 {
2255 GL_EXTCALL(glProvokingVertex(GL_FIRST_VERTEX_CONVENTION));
2256 }
2257 else if (gl_info->supported[EXT_PROVOKING_VERTEX])
2258 {
2259 GL_EXTCALL(glProvokingVertexEXT(GL_FIRST_VERTEX_CONVENTION_EXT));
2260 }
2262 {
2263 if (gl_info->supported[ARB_ES3_COMPATIBILITY])
2264 {
2265 gl_info->gl_ops.gl.p_glEnable(GL_PRIMITIVE_RESTART_FIXED_INDEX);
2266 checkGLcall("enable GL_PRIMITIVE_RESTART_FIXED_INDEX");
2267 }
2268 else
2269 {
2270 FIXME("OpenGL implementation does not support GL_PRIMITIVE_RESTART_FIXED_INDEX.\n");
2271 }
2272 }
2274 && gl_info->supported[ARB_SEAMLESS_CUBE_MAP])
2275 {
2276 gl_info->gl_ops.gl.p_glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
2277 checkGLcall("enable seamless cube map filtering");
2278 }
2279 if (gl_info->supported[ARB_CLIP_CONTROL])
2281
2282 /* If this happens to be the first context for the device, dummy textures
2283 * are not created yet. In that case, they will be created (and bound) by
2284 * create_dummy_textures right after this context is initialized. */
2285 if (wined3d_device_gl(device)->dummy_textures.tex_2d)
2287
2288 /* Initialise all rectangles to avoid resetting unused ones later. */
2289 gl_info->gl_ops.gl.p_glScissor(0, 0, 0, 0);
2290 checkGLcall("glScissor");
2291
2292 if (new_drawable)
2293 {
2294 gl_info->gl_ops.gl.p_glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
2295 gl_info->gl_ops.gl.p_glClearDepth(1.0f);
2296 gl_info->gl_ops.gl.p_glClearStencil(0);
2298 checkGLcall("glClear");
2299 }
2300 return WINED3D_OK;
2301
2302fail:
2303 free(context_gl->texture_type);
2304 wined3d_release_dc(context_gl->window, context_gl->dc);
2305 return E_FAIL;
2306}
#define DCX_USESTYLE
Definition: GetDCEx.c:10
static void list_init(struct list_entry *head)
Definition: list.h:51
BOOL wined3d_context_gl_set_current(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1571
void wined3d_context_gl_bind_dummy_textures(const struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1790
static void WINE_GLAPI wined3d_debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const char *message, void *ctx)
Definition: context_gl.c:1856
static DWORD context_generate_rt_mask(GLenum buffer)
Definition: context_gl.c:452
static BOOL wined3d_context_gl_create_wgl_ctx(struct wined3d_context_gl *context_gl, struct wined3d_swapchain_gl *swapchain_gl, BOOL *new_drawable)
Definition: context_gl.c:1924
#define E_FAIL
Definition: ddrawi.h:102
void wined3d_context_init(struct wined3d_context *context, struct wined3d_swapchain *swapchain)
Definition: context.c:89
HDC wined3d_device_gl_get_backup_dc(struct wined3d_device_gl *device_gl)
Definition: device.c:5313
void wined3d_release_dc(HWND window, HDC dc)
Definition: utils.c:6658
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
#define GL_AUX_BUFFERS
Definition: gl.h:492
#define GL_PACK_ALIGNMENT
Definition: gl.h:626
#define GL_TEXTURE0_ARB
Definition: gl.h:1966
#define GL_BACK
Definition: gl.h:271
#define GL_TEXTURE_ENV
Definition: gl.h:642
#define GL_LIGHT_MODEL_LOCAL_VIEWER
Definition: gl.h:334
#define GL_UNPACK_ALIGNMENT
Definition: gl.h:632
#define GL_TEXTURE_ENV_MODE
Definition: gl.h:643
#define GL_DONT_CARE
Definition: gl.h:583
#define GL_FALSE
Definition: gl.h:173
#define GL_STENCIL_BUFFER_BIT
Definition: gl.h:712
#define GL_LIGHT_MODEL_COLOR_CONTROL
Definition: gl.h:1498
#define GL_SEPARATE_SPECULAR_COLOR
Definition: gl.h:1500
#define GL_DEPTH_BUFFER_BIT
Definition: gl.h:710
#define GL_POINT_SPRITE_ARB
Definition: glext.h:1586
#define GL_COMBINE_EXT
Definition: glext.h:3229
#define GL_PROGRAM_FORMAT_ASCII_ARB
Definition: glext.h:1405
#define GL_FRAGMENT_PROGRAM_ARB
Definition: glext.h:1466
#define GL_TEXTURE_SHADER_NV
Definition: glext.h:3685
#define GL_TEXTURE_CUBE_MAP_SEAMLESS
Definition: glext.h:1913
#define GL_FIRST_VERTEX_CONVENTION_EXT
Definition: glext.h:4920
#define GL_PREVIOUS_TEXTURE_INPUT_NV
Definition: glext.h:3694
#define GL_FIRST_VERTEX_CONVENTION
Definition: glext.h:1907
#define GL_COORD_REPLACE_ARB
Definition: glext.h:1587
#define GL_POINT_SPRITE_COORD_ORIGIN
Definition: glext.h:460
if(dx< 0)
Definition: linetemp.h:194
#define min(a, b)
Definition: monoChain.cc:55
#define DCX_CACHE
Definition: winuser.h:2150
HDC WINAPI GetDCEx(_In_opt_ HWND, _In_opt_ HRGN, _In_ DWORD)
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define calloc
Definition: rosglue.h:14
#define ERR_ON(ch)
Definition: debug.h:423
unsigned int rev_tex_unit_map[MAX_GL_FRAGMENT_SAMPLERS+WINED3D_MAX_VERTEX_SAMPLERS]
Definition: wined3d_gl.h:677
struct list fbo_list
Definition: wined3d_gl.h:639
uint32_t dc_is_private
Definition: wined3d_gl.h:607
struct list fbo_destroy_list
Definition: wined3d_gl.h:640
GLuint dummy_arbfp_prog
Definition: wined3d_gl.h:684
uint32_t wined3d_creation_flags
struct wined3d_swapchain s
Definition: wined3d_gl.h:1126
BOOL WINAPI wglDeleteContext(HGLRC hglrc)
Definition: wgl.c:516
#define GL_DEBUG_TYPE_PORTABILITY
Definition: wgl.h:947
#define GL_PRIMITIVE_RESTART_FIXED_INDEX
Definition: wgl.h:3235
#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR
Definition: wgl.h:931
#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR
Definition: wgl.h:952
#define GL_DEBUG_TYPE_ERROR
Definition: wgl.h:934
#define GL_DEBUG_OUTPUT_SYNCHRONOUS
Definition: wgl.h:896
#define GL_DEBUG_TYPE_PERFORMANCE
Definition: wgl.h:942
#define WINED3D_MAX_COMBINED_SAMPLERS
Definition: wined3d.h:1600
#define WINED3D_OK
Definition: wined3d.h:33
#define WINED3D_NO_PRIMITIVE_RESTART
Definition: wined3d.h:1332
#define WINED3D_LEGACY_CUBEMAP_FILTERING
Definition: wined3d.h:1333
static void context_release(struct wined3d_context *context)
#define WINED3D_UNMAPPED_STAGE

Referenced by wined3d_swapchain_gl_create_context().

◆ wined3d_context_gl_map_bo_address()

void * wined3d_context_gl_map_bo_address ( struct wined3d_context_gl *  context_gl,
const struct wined3d_bo_address *  data,
size_t  size,
uint32_t  flags 
)

Definition at line 2932 of file context_gl.c.

2934{
2935 struct wined3d_bo *bo;
2936 void *map_ptr;
2937
2938 if (!(bo = data->buffer_object))
2939 return data->addr;
2940
2941 if (!(map_ptr = wined3d_bo_gl_map(wined3d_bo_gl(bo), context_gl, flags)))
2942 {
2943 ERR("Failed to map bo.\n");
2944 return NULL;
2945 }
2946
2947 return (uint8_t *)map_ptr + bo->buffer_offset + (uintptr_t)data->addr;
2948}
static void * wined3d_bo_gl_map(struct wined3d_bo_gl *bo, struct wined3d_context_gl *context_gl, uint32_t flags)
Definition: context_gl.c:2797
size_t buffer_offset

Referenced by adapter_gl_map_bo_address(), wined3d_context_gl_copy_bo_address(), wined3d_texture_gl_load_texture(), and wined3d_texture_gl_upload_data().

◆ wined3d_context_gl_reacquire()

struct wined3d_context_gl * wined3d_context_gl_reacquire ( struct wined3d_context_gl *  context_gl)

Definition at line 4378 of file context_gl.c.

4379{
4380 struct wined3d_context *acquired_context;
4381 struct wined3d_device *device;
4382
4383 if (!context_gl || context_gl->tid != GetCurrentThreadId())
4384 return NULL;
4385
4386 device = context_gl->c.device;
4388
4389 if (context_gl->c.current_rt.texture)
4390 {
4391 wined3d_context_gl_activate(context_gl, context_gl->c.current_rt.texture,
4392 context_gl->c.current_rt.sub_resource_idx);
4393 return context_gl;
4394 }
4395
4396 acquired_context = context_acquire(device, NULL, 0);
4397 if (acquired_context != &context_gl->c)
4398 ERR("Acquired context %p instead of %p.\n", acquired_context, &context_gl->c);
4399 return wined3d_context_gl(acquired_context);
4400}

Referenced by wined3d_fence_issue(), wined3d_fence_test(), wined3d_fence_wait(), wined3d_occlusion_query_ops_issue(), wined3d_occlusion_query_ops_poll(), wined3d_pipeline_query_ops_issue(), wined3d_pipeline_query_ops_poll(), wined3d_so_statistics_query_ops_issue(), wined3d_so_statistics_query_ops_poll(), and wined3d_timestamp_query_ops_poll().

◆ wined3d_context_gl_reference_bo()

◆ wined3d_context_gl_reference_buffer()

static void wined3d_context_gl_reference_buffer ( struct wined3d_context_gl *  context_gl,
struct wined3d_buffer *  buffer 
)
inlinestatic

◆ wined3d_context_gl_release()

void wined3d_context_gl_release ( struct wined3d_context_gl *  context_gl)

Definition at line 1631 of file context_gl.c.

1632{
1633 TRACE("Releasing context %p, level %u.\n", context_gl, context_gl->level);
1634
1635 if (WARN_ON(d3d))
1636 {
1637 if (!context_gl->level)
1638 WARN("Context %p is not active.\n", context_gl);
1639 else if (context_gl != wined3d_context_gl_get_current())
1640 WARN("Context %p is not the current context.\n", context_gl);
1641 }
1642
1643 if (!--context_gl->level)
1644 {
1646 context_gl->needs_set = 1;
1647 if (context_gl->restore_ctx)
1648 {
1649 TRACE("Restoring GL context %p on device context %p.\n", context_gl->restore_ctx, context_gl->restore_dc);
1650 context_restore_gl_context(context_gl->gl_info, context_gl->restore_dc, context_gl->restore_ctx);
1651 context_gl->restore_ctx = NULL;
1652 context_gl->restore_dc = NULL;
1653 }
1654
1655 if (context_gl->c.destroy_delayed)
1656 {
1657 TRACE("Destroying context %p.\n", context_gl);
1658 wined3d_context_gl_destroy(context_gl);
1659 }
1660 }
1661}
static void context_restore_gl_context(const struct wined3d_gl_info *gl_info, HDC dc, HGLRC gl_ctx)
Definition: context_gl.c:1323
void wined3d_context_gl_destroy(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:2308
static BOOL wined3d_context_gl_restore_pixel_format(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1165
uint32_t needs_set
Definition: wined3d_gl.h:611

Referenced by adapter_gl_release_context().

◆ wined3d_context_gl_set_current()

BOOL wined3d_context_gl_set_current ( struct wined3d_context_gl *  context_gl)

Definition at line 1571 of file context_gl.c.

1572{
1574
1575 if (old == context_gl)
1576 {
1577 TRACE("Already using D3D context %p.\n", context_gl);
1578 return TRUE;
1579 }
1580
1581 if (old)
1582 {
1583 if (old->c.destroyed)
1584 {
1585 TRACE("Switching away from destroyed context %p.\n", old);
1587 free((void *)old->gl_info);
1588 free(old);
1589 }
1590 else
1591 {
1593 {
1594 const struct wined3d_gl_info *gl_info = old->gl_info;
1595 TRACE("Flushing context %p before switching to %p.\n", old, context_gl);
1596 gl_info->gl_ops.gl.p_glFlush();
1597 }
1598 old->c.current = 0;
1599 }
1600 }
1601
1602 if (context_gl)
1603 {
1604 if (!context_gl->valid)
1605 {
1606 ERR("Trying to make invalid context %p current.\n", context_gl);
1607 return FALSE;
1608 }
1609
1610 TRACE("Switching to D3D context %p, GL context %p, device context %p.\n",
1611 context_gl, context_gl->gl_ctx, context_gl->dc);
1612 if (!wined3d_context_gl_set_gl_context(context_gl))
1613 return FALSE;
1614 context_gl->c.current = 1;
1615 }
1616 else if (wglGetCurrentContext())
1617 {
1618 TRACE("Clearing current D3D context.\n");
1619 if (!wglMakeCurrent(NULL, NULL))
1620 {
1621 unsigned int err = GetLastError();
1622 ERR("Failed to clear current GL context, last error %#x.\n", err);
1624 return FALSE;
1625 }
1626 }
1627
1628 return TlsSetValue(wined3d_context_tls_idx, context_gl);
1629}
static BOOL wined3d_context_gl_set_gl_context(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:1261
HGLRC WINAPI wglGetCurrentContext(void)
Definition: wgl.c:576
BOOL WINAPI wglMakeCurrent(HDC hdc, HGLRC hglrc)
Definition: wgl.c:652

Referenced by context_restore_gl_context(), DllMain(), wined3d_context_gl_activate(), wined3d_context_gl_init(), and wined3d_context_gl_set_gl_context().

◆ wined3d_context_gl_submit_command_fence()

void wined3d_context_gl_submit_command_fence ( struct wined3d_context_gl *  context_gl)

Definition at line 2653 of file context_gl.c.

2654{
2655 struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
2657 HRESULT hr;
2658
2659 if (!wined3d_array_reserve((void **)&context_gl->submitted.fences, &context_gl->submitted.fences_size,
2660 context_gl->submitted.fence_count + 1, sizeof(*context_gl->submitted.fences)))
2661 ERR("Failed to grow submitted command buffer array.\n");
2662
2663 f = &context_gl->submitted.fences[context_gl->submitted.fence_count++];
2664 f->id = device_gl->current_fence_id;
2665 if (FAILED(hr = wined3d_fence_create(&device_gl->d, &f->fence)))
2666 ERR("Failed to create fence, hr %#lx.\n", hr);
2667 wined3d_fence_issue(f->fence, &device_gl->d);
2668
2669 /* We don't expect this to ever happen, but handle it anyway. */
2670 if (!++device_gl->current_fence_id)
2671 {
2672 wined3d_context_gl_wait_command_fence(context_gl, device_gl->current_fence_id - 1);
2673 device_gl->completed_fence_id = 0;
2674 device_gl->current_fence_id = 1;
2675 }
2676 device_gl->retired_bo_size = 0;
2678}
static void wined3d_context_gl_cleanup_resources(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:2600
void wined3d_context_gl_wait_command_fence(struct wined3d_context_gl *context_gl, uint64_t id)
Definition: context_gl.c:2629
HRESULT hr
Definition: delayimp.cpp:582
void wined3d_fence_issue(struct wined3d_fence *fence, struct wined3d_device *device)
Definition: query.c:331
HRESULT wined3d_fence_create(struct wined3d_device *device, struct wined3d_fence **fence)
Definition: query.c:390
#define FAILED(hr)
Definition: intsafe.h:51
#define f
Definition: ke_i.h:83
struct wined3d_context_gl::@345 submitted
struct wined3d_device d
Definition: wined3d_gl.h:847
uint64_t completed_fence_id
Definition: wined3d_gl.h:854

Referenced by swapchain_gl_present(), wined3d_bo_gl_map(), wined3d_context_gl_cleanup(), wined3d_context_gl_destroy_bo(), and wined3d_device_gl_delete_opengl_contexts_cs().

◆ wined3d_context_gl_texture_update()

void wined3d_context_gl_texture_update ( struct wined3d_context_gl *  context_gl,
const struct wined3d_texture_gl *  texture_gl 
)

Definition at line 1143 of file context_gl.c.

1145{
1146 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1147 struct fbo_entry *entry = context_gl->current_fbo;
1148 unsigned int i;
1149
1150 if (!entry || context_gl->rebind_fbo)
1151 return;
1152
1153 for (i = 0; i < gl_info->limits.buffers + 1; ++i)
1154 {
1155 if (texture_gl->texture_rgb.name == entry->key.objects[i].object
1156 || texture_gl->texture_srgb.name == entry->key.objects[i].object)
1157 {
1158 TRACE("Updated texture %p is bound as attachment %u to the current FBO.\n", texture_gl, i);
1159 context_gl->rebind_fbo = TRUE;
1160 return;
1161 }
1162 }
1163}
uint32_t entry
Definition: isohybrid.c:63
Definition: wined3d_gl.h:587
uint32_t rebind_fbo
Definition: wined3d_gl.h:610
struct gl_texture texture_rgb texture_srgb
Definition: wined3d_gl.h:943

Referenced by wined3d_texture_gl_upload_data().

◆ wined3d_context_gl_unmap_bo_address()

void wined3d_context_gl_unmap_bo_address ( struct wined3d_context_gl *  context_gl,
const struct wined3d_bo_address *  data,
unsigned int  range_count,
const struct wined3d_range *  ranges 
)

Definition at line 2988 of file context_gl.c.

2990{
2991 struct wined3d_bo_gl *bo;
2992
2993 if (!data->buffer_object)
2994 return;
2995 bo = wined3d_bo_gl(data->buffer_object);
2996
2997 assert(bo->b.map_ptr);
2998
2999 flush_bo_ranges(context_gl, wined3d_const_bo_address(data), range_count, ranges);
3000 wined3d_bo_gl_unmap(bo, context_gl);
3001}
static void wined3d_bo_gl_unmap(struct wined3d_bo_gl *bo, struct wined3d_context_gl *context_gl)
Definition: context_gl.c:2891

Referenced by adapter_gl_unmap_bo_address(), wined3d_context_gl_copy_bo_address(), wined3d_texture_gl_load_texture(), and wined3d_texture_gl_upload_data().

◆ wined3d_context_gl_update_stream_sources()

void wined3d_context_gl_update_stream_sources ( struct wined3d_context_gl *  context_gl,
const struct wined3d_state *  state 
)

Definition at line 5095 of file context_gl.c.

5097{
5098 wined3d_context_gl_load_numbered_arrays(context_gl, &context_gl->c.stream_info, state);
5099}
static void wined3d_context_gl_load_numbered_arrays(struct wined3d_context_gl *context_gl, const struct wined3d_stream_info *stream_info, const struct wined3d_state *state)
Definition: context_gl.c:4885

Referenced by streamsrc(), and vdecl_miscpart().

◆ wined3d_context_gl_wait_command_fence()

void wined3d_context_gl_wait_command_fence ( struct wined3d_context_gl *  context_gl,
uint64_t  id 
)

Definition at line 2629 of file context_gl.c.

2630{
2631 struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device);
2633 SIZE_T i;
2634
2635 if (id <= device_gl->completed_fence_id
2636 || id > device_gl->current_fence_id) /* In case the fence ID wrapped. */
2637 return;
2638
2639 for (i = 0; i < context_gl->submitted.fence_count; ++i)
2640 {
2641 if (context_gl->submitted.fences[i].id != id)
2642 continue;
2643
2644 if ((ret = wined3d_fence_wait(context_gl->submitted.fences[i].fence, &device_gl->d)) != WINED3D_FENCE_OK)
2645 ERR("Failed to wait for command fence with id 0x%s, ret %#x.\n", wine_dbgstr_longlong(id), ret);
2647 return;
2648 }
2649
2650 ERR("Failed to find fence for command fence with id 0x%s.\n", wine_dbgstr_longlong(id));
2651}
enum wined3d_fence_result wined3d_fence_wait(const struct wined3d_fence *fence, struct wined3d_device *device)
Definition: query.c:256
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
Definition: compat.h:49
return ret
Definition: mutex.c:147
ULONG_PTR SIZE_T
Definition: typedefs.h:80
wined3d_fence_result
Definition: wined3d_gl.h:446

Referenced by wined3d_bo_gl_map(), wined3d_context_gl_cleanup(), wined3d_context_gl_submit_command_fence(), and wined3d_device_gl_delete_opengl_contexts_cs().

◆ wined3d_device_gl()

static struct wined3d_device_gl * wined3d_device_gl ( struct wined3d_device *  device)
inlinestatic

Definition at line 870 of file wined3d_gl.h.

871{
873}
#define d
Definition: ke_i.h:81

◆ wined3d_device_gl_allocator_lock()

static void wined3d_device_gl_allocator_lock ( struct wined3d_device_gl *  device_gl)
inlinestatic

Definition at line 880 of file wined3d_gl.h.

881{
883}
CRITICAL_SECTION allocator_cs
Definition: wined3d_gl.h:852
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)

Referenced by wined3d_allocator_chunk_gl_lock(), wined3d_device_gl_allocate_memory(), and wined3d_device_gl_free_memory().

◆ wined3d_device_gl_allocator_unlock()

static void wined3d_device_gl_allocator_unlock ( struct wined3d_device_gl *  device_gl)
inlinestatic

Definition at line 885 of file wined3d_gl.h.

886{
888}
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)

Referenced by wined3d_allocator_chunk_gl_unlock(), wined3d_device_gl_allocate_memory(), and wined3d_device_gl_free_memory().

◆ wined3d_device_gl_create_bo()

bool wined3d_device_gl_create_bo ( struct wined3d_device_gl *  device_gl,
struct wined3d_context_gl *  context_gl,
GLsizeiptr  size,
GLenum  binding,
GLenum  usage,
bool  coherent,
GLbitfield  flags,
struct wined3d_bo_gl *  bo 
)

Definition at line 1335 of file device.c.

1337{
1338 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device_gl->d.adapter)->gl_info;
1339 unsigned int memory_type_idx = wined3d_device_gl_find_memory_type(flags);
1341 GLsizeiptr buffer_offset = 0;
1342 GLuint id = 0;
1343
1344 TRACE("device_gl %p, context_gl %p, size %Iu, binding %#x, usage %#x, coherent %#x, flags %#x, bo %p.\n",
1345 device_gl, context_gl, size, binding, usage, coherent, flags, bo);
1346
1347 if (gl_info->supported[ARB_BUFFER_STORAGE])
1348 {
1349 /* Only suballocate dynamic buffers.
1350 *
1351 * We only need suballocation so that we can allocate GL buffers from
1352 * the client thread and thereby accelerate DISCARD maps.
1353 *
1354 * For other buffer types, suballocating means that a whole-buffer
1355 * upload won't be replacing the whole buffer anymore. If the driver
1356 * isn't smart enough to track individual buffer ranges then it'll
1357 * force synchronizing that BO with the GPU. Even using ARB_sync
1358 * ourselves won't help here, because glBufferSubData() is still
1359 * implicitly synchronized. */
1361 {
1362 if (use_buffer_chunk_suballocation(device_gl, gl_info, binding))
1363 {
1364 if ((memory = wined3d_device_gl_allocate_memory(device_gl, context_gl, memory_type_idx, size, &id)))
1365 buffer_offset = memory->offset;
1366 else if (!context_gl)
1367 WARN_(d3d_perf)("Failed to suballocate buffer from the client thread.\n");
1368 }
1369 else if (context_gl)
1370 {
1371 WARN_(d3d_perf)("Not allocating chunk memory for binding type %#x.\n", binding);
1372 id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type_idx, size);
1373 }
1374 }
1375 else
1376 {
1377 id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type_idx, size);
1378 }
1379
1380 if (!id)
1381 {
1382 if (context_gl)
1383 WARN("Failed to allocate buffer.\n");
1384 return false;
1385 }
1386 }
1387 else
1388 {
1389 if (!context_gl)
1390 return false;
1391
1392 GL_EXTCALL(glGenBuffers(1, &id));
1393 if (!id)
1394 {
1395 checkGLcall("buffer object creation");
1396 return false;
1397 }
1398 TRACE("Created buffer object %u.\n", id);
1399 wined3d_context_gl_bind_bo(context_gl, binding, id);
1400
1401 if (!coherent && gl_info->supported[APPLE_FLUSH_BUFFER_RANGE])
1402 {
1403 GL_EXTCALL(glBufferParameteriAPPLE(binding, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
1405 }
1406
1407 GL_EXTCALL(glBufferData(binding, size, NULL, usage));
1408
1409 wined3d_context_gl_bind_bo(context_gl, binding, 0);
1410 checkGLcall("buffer object creation");
1411 }
1412
1413 bo->id = id;
1414 bo->memory = memory;
1415 bo->size = size;
1416 bo->binding = binding;
1417 bo->usage = usage;
1418 bo->flags = flags;
1419 bo->b.coherent = coherent;
1420 list_init(&bo->b.users);
1421 bo->command_fence_id = 0;
1422 bo->b.buffer_offset = buffer_offset;
1423 bo->b.memory_offset = bo->b.buffer_offset;
1424 bo->b.map_ptr = NULL;
1425 bo->b.client_map_count = 0;
1426 bo->b.refcount = 1;
1427
1428 return true;
1429}
GLuint wined3d_context_gl_allocate_vram_chunk_buffer(struct wined3d_context_gl *context_gl, unsigned int pool, size_t size)
Definition: context_gl.c:2707
static struct wined3d_allocator_block * wined3d_device_gl_allocate_memory(struct wined3d_device_gl *device_gl, struct wined3d_context_gl *context_gl, unsigned int memory_type, GLsizeiptr size, GLuint *id)
Definition: device.c:1279
static unsigned int wined3d_device_gl_find_memory_type(GLbitfield flags)
Definition: device.c:1260
static bool use_buffer_chunk_suballocation(struct wined3d_device_gl *device_gl, const struct wined3d_gl_info *gl_info, GLenum binding)
Definition: device.c:1309
GLbitfield flags
Definition: device.c:1245
#define GL_BUFFER_SERIALIZED_MODIFY_APPLE
Definition: glext.h:4547
ptrdiff_t GLsizeiptr
Definition: glext.h:5499
#define GL_BUFFER_FLUSHING_UNMAP_APPLE
Definition: glext.h:4548
GLsizeiptr const GLvoid GLenum usage
Definition: glext.h:5919
static char memory[1024 *256]
Definition: process.c:122
#define WARN_(ch,...)
Definition: debug.h:157
GLenum usage
Definition: wined3d_gl.h:423
#define GL_CLIENT_STORAGE_BIT
Definition: wgl.h:399

Referenced by adapter_gl_alloc_bo(), wined3d_bo_gl_map(), wined3d_buffer_gl_create_buffer_object(), wined3d_texture_gl_prepare_buffer_object(), and wined3d_unordered_access_view_gl_cs_init().

◆ wined3d_device_gl_create_primary_opengl_context_cs()

void wined3d_device_gl_create_primary_opengl_context_cs ( void *  object)

Definition at line 1476 of file device.c.

1477{
1478 struct wined3d_device_gl *device_gl = object;
1479 struct wined3d_context_gl *context_gl;
1480 struct wined3d_swapchain *swapchain;
1481 struct wined3d_context *context;
1482 struct wined3d_texture *target;
1483 struct wined3d_device *device;
1484 HRESULT hr;
1485
1486 TRACE("device %p.\n", device_gl);
1487
1488 device = &device_gl->d;
1489 swapchain = device->swapchains[0];
1490 target = swapchain->back_buffers ? swapchain->back_buffers[0] : swapchain->front_buffer;
1491 if (!(context = context_acquire(device, target, 0)))
1492 {
1493 WARN("Failed to acquire context.\n");
1494 return;
1495 }
1496
1497 context_gl = wined3d_context_gl(context);
1498
1500 {
1501 WARN("Failed to initialise allocator.\n");
1504 return;
1505 }
1506
1507 if (FAILED(hr = device->shader_backend->shader_alloc_private(device,
1508 device->adapter->vertex_pipe, device->adapter->fragment_pipe)))
1509 {
1510 ERR("Failed to allocate shader private data, hr %#lx.\n", hr);
1514 return;
1515 }
1516
1517 if (!(device->blitter = wined3d_cpu_blitter_create()))
1518 {
1519 ERR("Failed to create CPU blitter.\n");
1520 device->shader_backend->shader_free_private(device, NULL);
1524 return;
1525 }
1526
1527 wined3d_ffp_blitter_create(&device->blitter, context_gl->gl_info);
1529 wined3d_fbo_blitter_create(&device->blitter, context_gl->gl_info);
1530 wined3d_raw_blitter_create(&device->blitter, context_gl->gl_info);
1531
1532 wined3d_device_gl_create_dummy_textures(device_gl, context_gl);
1535}
static void wined3d_device_gl_create_dummy_textures(struct wined3d_device_gl *device_gl, struct wined3d_context_gl *context_gl)
Definition: device.c:572
static const struct @334 gl_memory_types[]
static const struct wined3d_allocator_ops wined3d_allocator_gl_ops
Definition: device.c:1237
void wined3d_device_create_default_samplers(struct wined3d_device *device, struct wined3d_context *context)
Definition: device.c:737
struct wined3d_blitter * wined3d_cpu_blitter_create(void)
Definition: surface.c:1300
void wined3d_fbo_blitter_create(struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
Definition: texture.c:6105
void wined3d_raw_blitter_create(struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
Definition: texture.c:6262
void wined3d_ffp_blitter_create(struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info)
Definition: texture.c:5995
bool wined3d_allocator_init(struct wined3d_allocator *allocator, size_t pool_count, const struct wined3d_allocator_ops *allocator_ops)
Definition: utils.c:7265
void wined3d_allocator_cleanup(struct wined3d_allocator *allocator)
Definition: utils.c:7163
struct wined3d_blitter * wined3d_glsl_blitter_create(struct wined3d_blitter **next, const struct wined3d_device *device)
struct wined3d_allocator allocator
Definition: wined3d_gl.h:853

Referenced by adapter_gl_init_3d().

◆ wined3d_device_gl_delete_opengl_contexts_cs()

void wined3d_device_gl_delete_opengl_contexts_cs ( void *  object)

Definition at line 1431 of file device.c.

1432{
1433 struct wined3d_device_gl *device_gl = object;
1434 struct wined3d_context_gl *context_gl;
1435 struct wined3d_context *context;
1436 struct wined3d_device *device;
1437 struct wined3d_shader *shader;
1438
1439 TRACE("device %p.\n", device_gl);
1440
1441 device = &device_gl->d;
1442
1444 {
1445 device->shader_backend->shader_destroy(shader);
1446 }
1447
1449 context_gl = wined3d_context_gl(context);
1450 device->blitter->ops->blitter_destroy(device->blitter, context);
1451 device->shader_backend->shader_free_private(device, context);
1452 wined3d_device_gl_destroy_dummy_textures(device_gl, context_gl);
1453
1454 if (context_gl->c.d3d_info->fences)
1455 {
1458 wined3d_device_gl(context_gl->c.device)->current_fence_id - 1);
1459 }
1461
1463
1464 while (device->context_count)
1466
1467 if (device_gl->backup_dc)
1468 {
1469 TRACE("Destroying backup wined3d window %p, dc %p.\n", device_gl->backup_wnd, device_gl->backup_dc);
1470
1471 wined3d_release_dc(device_gl->backup_wnd, device_gl->backup_dc);
1472 DestroyWindow(device_gl->backup_wnd);
1473 }
1474}
static void wined3d_device_gl_destroy_dummy_textures(struct wined3d_device_gl *device_gl, struct wined3d_context_gl *context_gl)
Definition: device.c:698
GLuint shader
Definition: glext.h:6030
BOOL WINAPI DestroyWindow(_In_ HWND)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
Definition: list.h:236
struct list shader_list_entry

Referenced by adapter_gl_uninit_3d().

◆ wined3d_device_gl_from_allocator()

static struct wined3d_device_gl * wined3d_device_gl_from_allocator ( struct wined3d_allocator *  allocator)
inlinestatic

◆ wined3d_device_gl_get_backup_dc()

HDC wined3d_device_gl_get_backup_dc ( struct wined3d_device_gl *  device_gl)

Definition at line 5313 of file device.c.

5314{
5315 TRACE("device_gl %p.\n", device_gl);
5316
5317 if (!device_gl->backup_dc)
5318 {
5319 TRACE("Creating the backup window for device %p.\n", device_gl);
5320
5321 if (!(device_gl->backup_wnd = CreateWindowA(WINED3D_OPENGL_WINDOW_CLASS_NAME, "WineD3D fake window",
5322 WS_OVERLAPPEDWINDOW, 10, 10, 10, 10, NULL, NULL, NULL, NULL)))
5323 {
5324 ERR("Failed to create a window.\n");
5325 return NULL;
5326 }
5327
5328 if (!(device_gl->backup_dc = GetDC(device_gl->backup_wnd)))
5329 {
5330 ERR("Failed to get a DC.\n");
5331 DestroyWindow(device_gl->backup_wnd);
5332 device_gl->backup_wnd = NULL;
5333 return NULL;
5334 }
5335 }
5336
5337 return device_gl->backup_dc;
5338}
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4469
HDC WINAPI GetDC(_In_opt_ HWND)
#define WINED3D_OPENGL_WINDOW_CLASS_NAME

Referenced by wined3d_context_gl_create_wgl_ctx(), wined3d_context_gl_init(), and wined3d_context_gl_set_gl_context().

◆ wined3d_device_gl_get_memory_type_flags()

GLbitfield wined3d_device_gl_get_memory_type_flags ( unsigned int  memory_type_idx)

Definition at line 1274 of file device.c.

1275{
1276 return gl_memory_types[memory_type_idx].flags;
1277}

Referenced by wined3d_allocator_chunk_gl_map(), and wined3d_context_gl_allocate_vram_chunk_buffer().

◆ wined3d_fbo_blitter_create()

void wined3d_fbo_blitter_create ( struct wined3d_blitter **  next,
const struct wined3d_gl_info *  gl_info 
)

Definition at line 6105 of file texture.c.

6106{
6107 struct wined3d_blitter *blitter;
6108
6109 if (!(blitter = malloc(sizeof(*blitter))))
6110 return;
6111
6112 TRACE("Created blitter %p.\n", blitter);
6113
6114 blitter->ops = &fbo_blitter_ops;
6115 blitter->next = *next;
6116 *next = blitter;
6117}
static const struct wined3d_blitter_ops fbo_blitter_ops
Definition: texture.c:6098
static unsigned __int64 next
Definition: rand_nt.c:6
struct wined3d_blitter * next
const struct wined3d_blitter_ops * ops

Referenced by wined3d_device_gl_create_primary_opengl_context_cs().

◆ wined3d_fence_create()

HRESULT wined3d_fence_create ( struct wined3d_device *  device,
struct wined3d_fence **  fence 
)

Definition at line 390 of file query.c.

391{
392 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
393 struct wined3d_fence *object;
394 HRESULT hr;
395
396 TRACE("device %p, fence %p.\n", device, fence);
397
398 if (!(object = calloc(1, sizeof(*object))))
399 return E_OUTOFMEMORY;
400
401 if (FAILED(hr = wined3d_fence_init(object, gl_info)))
402 {
403 free(object);
404 return hr;
405 }
406
407 TRACE("Created fence %p.\n", object);
408 *fence = object;
409
410 return WINED3D_OK;
411}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT wined3d_fence_init(struct wined3d_fence *fence, const struct wined3d_gl_info *gl_info)
Definition: query.c:379

Referenced by wined3d_context_gl_submit_command_fence().

◆ wined3d_fence_destroy()

void wined3d_fence_destroy ( struct wined3d_fence *  fence)

Definition at line 373 of file query.c.

374{
375 wined3d_fence_free(fence);
376 free(fence);
377}
static void wined3d_fence_free(struct wined3d_fence *fence)
Definition: query.c:367

Referenced by wined3d_context_gl_poll_fences().

◆ wined3d_fence_issue()

void wined3d_fence_issue ( struct wined3d_fence *  fence,
struct wined3d_device *  device 
)

Definition at line 331 of file query.c.

332{
333 struct wined3d_context_gl *context_gl = NULL;
334 const struct wined3d_gl_info *gl_info;
335
336 if (fence->context_gl && !(context_gl = wined3d_context_gl_reacquire(fence->context_gl))
337 && !fence->context_gl->gl_info->supported[ARB_SYNC])
339 if (!context_gl)
341 gl_info = context_gl->gl_info;
342 if (!fence->context_gl)
343 wined3d_context_gl_alloc_fence(context_gl, fence);
344
345 if (gl_info->supported[ARB_SYNC])
346 {
347 if (fence->object.sync)
348 GL_EXTCALL(glDeleteSync(fence->object.sync));
349 checkGLcall("glDeleteSync");
350 fence->object.sync = GL_EXTCALL(glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0));
351 checkGLcall("glFenceSync");
352 }
353 else if (gl_info->supported[APPLE_FENCE])
354 {
355 GL_EXTCALL(glSetFenceAPPLE(fence->object.id));
356 checkGLcall("glSetFenceAPPLE");
357 }
358 else if (gl_info->supported[NV_FENCE])
359 {
360 GL_EXTCALL(glSetFenceNV(fence->object.id, GL_ALL_COMPLETED_NV));
361 checkGLcall("glSetFenceNV");
362 }
363
364 context_release(&context_gl->c);
365}
void wined3d_context_gl_free_fence(struct wined3d_fence *fence)
Definition: context_gl.c:966
struct wined3d_context_gl * wined3d_context_gl_reacquire(struct wined3d_context_gl *context_gl)
Definition: context_gl.c:4378
void wined3d_context_gl_alloc_fence(struct wined3d_context_gl *context_gl, struct wined3d_fence *fence)
Definition: context_gl.c:925
#define GL_SYNC_GPU_COMMANDS_COMPLETE
Definition: glext.h:1923
#define GL_ALL_COMPLETED_NV
Definition: glext.h:3621

Referenced by wined3d_context_gl_submit_command_fence(), and wined3d_event_query_ops_issue().

◆ wined3d_fence_supported()

static bool wined3d_fence_supported ( const struct wined3d_gl_info *  gl_info)
inlinestatic

Definition at line 394 of file wined3d_gl.h.

395{
396 return gl_info->supported[ARB_SYNC] || gl_info->supported[NV_FENCE] || gl_info->supported[APPLE_FENCE];
397}

Referenced by wined3d_adapter_gl_init_d3d_info(), and wined3d_fence_init().

◆ wined3d_fence_test()

enum wined3d_fence_result wined3d_fence_test ( const struct wined3d_fence *  fence,
struct wined3d_device *  device,
uint32_t  flags 
)

Definition at line 178 of file query.c.

180{
181 const struct wined3d_gl_info *gl_info;
182 struct wined3d_context_gl *context_gl;
184 BOOL fence_result;
185
186 TRACE("fence %p, device %p, flags %#x.\n", fence, device, flags);
187
188 if (!fence->context_gl)
189 {
190 TRACE("Fence not issued.\n");
192 }
193
194 if (!(context_gl = wined3d_context_gl_reacquire(fence->context_gl)))
195 {
196 if (!fence->context_gl->gl_info->supported[ARB_SYNC])
197 {
198 WARN("Fence tested from wrong thread.\n");
200 }
202 }
203 gl_info = context_gl->gl_info;
204
205 if (gl_info->supported[ARB_SYNC])
206 {
207 GLenum gl_ret = GL_EXTCALL(glClientWaitSync(fence->object.sync,
209 checkGLcall("glClientWaitSync");
210
211 switch (gl_ret)
212 {
216 break;
217
220 break;
221
222 case GL_WAIT_FAILED:
223 default:
224 ERR("glClientWaitSync returned %#x.\n", gl_ret);
226 }
227 }
228 else if (gl_info->supported[APPLE_FENCE])
229 {
230 fence_result = GL_EXTCALL(glTestFenceAPPLE(fence->object.id));
231 checkGLcall("glTestFenceAPPLE");
232 if (fence_result)
234 else
236 }
237 else if (gl_info->supported[NV_FENCE])
238 {
239 fence_result = GL_EXTCALL(glTestFenceNV(fence->object.id));
240 checkGLcall("glTestFenceNV");
241 if (fence_result)
243 else
245 }
246 else
247 {
248 ERR("Fence created despite lack of GL support.\n");
250 }
251
252 context_release(&context_gl->c);
253 return ret;
254}
#define GL_ALREADY_SIGNALED
Definition: glext.h:1926
#define GL_CONDITION_SATISFIED
Definition: glext.h:1928
#define GL_TIMEOUT_EXPIRED
Definition: glext.h:1927
#define GL_WAIT_FAILED
Definition: glext.h:1929
#define GL_SYNC_FLUSH_COMMANDS_BIT
Definition: glext.h:1930
#define WINED3DGETDATA_FLUSH
Definition: wined3d.h:783

Referenced by wined3d_context_gl_poll_fences(), and wined3d_event_query_ops_poll().

◆ wined3d_fence_wait()

enum wined3d_fence_result wined3d_fence_wait ( const struct wined3d_fence *  fence,
struct wined3d_device *  device 
)

Definition at line 256 of file query.c.

258{
259 const struct wined3d_gl_info *gl_info;
260 struct wined3d_context_gl *context_gl;
262
263 TRACE("fence %p, device %p.\n", fence, device);
264
265 if (!fence->context_gl)
266 {
267 TRACE("Fence not issued.\n");
269 }
270 gl_info = fence->context_gl->gl_info;
271
272 if (!(context_gl = wined3d_context_gl_reacquire(fence->context_gl)))
273 {
274 /* A glFinish does not reliably wait for draws in other contexts. The caller has
275 * to find its own way to cope with the thread switch
276 */
277 if (!gl_info->supported[ARB_SYNC])
278 {
279 WARN("Fence finished from wrong thread.\n");
281 }
283 }
284 gl_info = context_gl->gl_info;
285
286 if (gl_info->supported[ARB_SYNC])
287 {
288 /* Timeouts near 0xffffffffffffffff may immediately return GL_TIMEOUT_EXPIRED,
289 * possibly because macOS internally adds some slop to the timer. To avoid this,
290 * we use a large number that isn't near the point of overflow (macOS 10.12.5).
291 */
292 GLenum gl_ret = GL_EXTCALL(glClientWaitSync(fence->object.sync,
294 checkGLcall("glClientWaitSync");
295
296 switch (gl_ret)
297 {
301 break;
302
303 /* We don't expect a timeout for a ~292 year wait */
304 default:
305 ERR("glClientWaitSync returned %#x.\n", gl_ret);
307 }
308 }
309 else if (gl_info->supported[APPLE_FENCE])
310 {
311 GL_EXTCALL(glFinishFenceAPPLE(fence->object.id));
312 checkGLcall("glFinishFenceAPPLE");
314 }
315 else if (gl_info->supported[NV_FENCE])
316 {
317 GL_EXTCALL(glFinishFenceNV(fence->object.id));
318 checkGLcall("glFinishFenceNV");
320 }
321 else
322 {
323 ERR("Fence created without GL support.\n");
325 }
326
327 context_release(&context_gl->c);
328 return ret;
329}
uint64_t GLuint64
Definition: glext.h:5568

Referenced by wined3d_context_gl_wait_command_fence().

◆ wined3d_ffp_blitter_create()

void wined3d_ffp_blitter_create ( struct wined3d_blitter **  next,
const struct wined3d_gl_info *  gl_info 
)

Definition at line 5995 of file texture.c.

5996{
5997 struct wined3d_blitter *blitter;
5998
5999 if (!(blitter = malloc(sizeof(*blitter))))
6000 return;
6001
6002 TRACE("Created blitter %p.\n", blitter);
6003
6004 blitter->ops = &ffp_blitter_ops;
6005 blitter->next = *next;
6006 *next = blitter;
6007}
static const struct wined3d_blitter_ops ffp_blitter_ops
Definition: texture.c:5988

Referenced by wined3d_device_gl_create_primary_opengl_context_cs().

◆ wined3d_format_gl()

Definition at line 1156 of file wined3d_gl.h.

1157{
1159}

◆ wined3d_gl_compare_func()

GLenum wined3d_gl_compare_func ( enum wined3d_cmp_func  f)

Definition at line 138 of file ffp_gl.c.

139{
140 switch (f)
141 {
143 return GL_NEVER;
144 case WINED3D_CMP_LESS:
145 return GL_LESS;
147 return GL_EQUAL;
149 return GL_LEQUAL;
151 return GL_GREATER;
153 return GL_NOTEQUAL;
155 return GL_GEQUAL;
157 return GL_ALWAYS;
158 default:
159 if (!f)
160 WARN("Unrecognized compare function %#x.\n", f);
161 else
162 FIXME("Unrecognized compare function %#x.\n", f);
163 return GL_NONE;
164 }
165}
#define GL_NEVER
Definition: gl.h:293
#define GL_ALWAYS
Definition: gl.h:300
#define GL_LESS
Definition: gl.h:294
#define GL_NOTEQUAL
Definition: gl.h:298
#define GL_LEQUAL
Definition: gl.h:296
#define GL_GEQUAL
Definition: gl.h:299
#define GL_GREATER
Definition: gl.h:297
#define GL_EQUAL
Definition: gl.h:295
@ WINED3D_CMP_ALWAYS
Definition: wined3d.h:468
@ WINED3D_CMP_GREATER
Definition: wined3d.h:465
@ WINED3D_CMP_LESSEQUAL
Definition: wined3d.h:464
@ WINED3D_CMP_NOTEQUAL
Definition: wined3d.h:466
@ WINED3D_CMP_LESS
Definition: wined3d.h:462
@ WINED3D_CMP_EQUAL
Definition: wined3d.h:463
@ WINED3D_CMP_GREATEREQUAL
Definition: wined3d.h:467
@ WINED3D_CMP_NEVER
Definition: wined3d.h:461

Referenced by depth(), glsl_fragment_pipe_alpha_test_func(), state_stencil(), and wined3d_sampler_gl_cs_init().

◆ wined3d_gl_get_internal_format()

static GLuint wined3d_gl_get_internal_format ( struct wined3d_resource *  resource,
const struct wined3d_format_gl *  format_gl,
bool  srgb 
)
inlinestatic

Definition at line 1161 of file wined3d_gl.h.

1163{
1164 if (srgb)
1165 return format_gl->srgb_internal;
1167 return format_gl->rt_internal;
1168 else
1169 return format_gl->internal;
1170}
#define WINED3D_BIND_RENDER_TARGET
Definition: wined3d.h:914

Referenced by gl_formats_compatible(), texture2d_blt_fbo(), wined3d_texture_gl_prepare_texture(), and wined3d_texture_gl_upload_bo().

◆ wined3d_gl_limits_get_texture_unit_range()

void wined3d_gl_limits_get_texture_unit_range ( const struct wined3d_gl_limits *  gl_limits,
enum wined3d_shader_type  shader_type,
unsigned int *  base,
unsigned int *  count 
)

Definition at line 6712 of file utils.c.

6714{
6715 unsigned int i;
6716
6718 {
6719 if (gl_limits->combined_samplers == gl_limits->graphics_samplers)
6720 *base = 0;
6721 else
6722 *base = gl_limits->graphics_samplers;
6724 return;
6725 }
6726
6727 *base = 0;
6728 for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i)
6729 {
6730 *count = gl_limits->samplers[i];
6731 if (i == shader_type)
6732 return;
6733 *base += *count;
6734 }
6735
6736 ERR("Unrecognized shader type %#x.\n", shader_type);
6737 *count = 0;
6738}
unsigned int samplers[WINED3D_SHADER_TYPE_COUNT]
Definition: wined3d_gl.h:284
unsigned int graphics_samplers
Definition: wined3d_gl.h:285
unsigned int combined_samplers
Definition: wined3d_gl.h:286
@ WINED3D_SHADER_TYPE_GRAPHICS_COUNT
Definition: wined3d.h:846
@ WINED3D_SHADER_TYPE_COMPUTE
Definition: wined3d.h:848

Referenced by wined3d_context_gl_get_tex_unit_mapping(), and wined3d_context_gl_init().

◆ wined3d_gl_limits_get_uniform_block_range()

void wined3d_gl_limits_get_uniform_block_range ( const struct wined3d_gl_limits *  gl_limits,
enum wined3d_shader_type  shader_type,
unsigned int *  base,
unsigned int *  count 
)

Definition at line 6694 of file utils.c.

6696{
6697 unsigned int i;
6698
6699 *base = 0;
6700 for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
6701 {
6702 *count = gl_limits->uniform_blocks[i];
6703 if (i == shader_type)
6704 return;
6705 *base += *count;
6706 }
6707
6708 ERR("Unrecognized shader type %#x.\n", shader_type);
6709 *count = 0;
6710}
unsigned int uniform_blocks[WINED3D_SHADER_TYPE_COUNT]
Definition: wined3d_gl.h:283
@ WINED3D_SHADER_TYPE_COUNT
Definition: wined3d.h:849

Referenced by create_resource_bindings(), shader_generate_glsl_declarations(), shader_glsl_init_uniform_block_bindings(), and state_cb().

◆ wined3d_gl_mag_filter()

static GLenum wined3d_gl_mag_filter ( enum wined3d_texture_filter_type  mag_filter)
inlinestatic

Definition at line 377 of file wined3d_gl.h.

378{
379 return magLookup[mag_filter];
380}
const GLenum magLookup[WINED3D_TEXF_LINEAR+1]
Definition: directx.c:71

Referenced by apply_texture_blit_state(), wined3d_sampler_gl_cs_init(), and wined3d_texture_gl_apply_sampler_desc().

◆ wined3d_gl_min_mip_filter()

static GLenum wined3d_gl_min_mip_filter ( enum wined3d_texture_filter_type  min_filter,
enum wined3d_texture_filter_type  mip_filter 
)
inlinestatic

Definition at line 382 of file wined3d_gl.h.

384{
385 return minMipLookup[min_filter].mip[mip_filter];
386}
const struct min_lookup minMipLookup[WINED3D_TEXF_LINEAR+1]
Definition: directx.c:63

Referenced by apply_texture_blit_state(), wined3d_sampler_gl_cs_init(), and wined3d_texture_gl_apply_sampler_desc().

◆ wined3d_gl_texture_swizzle_from_color_fixup()

void wined3d_gl_texture_swizzle_from_color_fixup ( GLint  swizzle[4],
struct color_fixup_desc  fixup 
)

Definition at line 1269 of file texture.c.

1270{
1271 static const GLenum swizzle_source[] =
1272 {
1273 GL_ZERO, /* CHANNEL_SOURCE_ZERO */
1274 GL_ONE, /* CHANNEL_SOURCE_ONE */
1275 GL_RED, /* CHANNEL_SOURCE_X */
1276 GL_GREEN, /* CHANNEL_SOURCE_Y */
1277 GL_BLUE, /* CHANNEL_SOURCE_Z */
1278 GL_ALPHA, /* CHANNEL_SOURCE_W */
1279 };
1280
1281 swizzle[0] = swizzle_source[fixup.x_source];
1282 swizzle[1] = swizzle_source[fixup.y_source];
1283 swizzle[2] = swizzle_source[fixup.z_source];
1284 swizzle[3] = swizzle_source[fixup.w_source];
1285}
#define GL_BLUE
Definition: gl.h:482
#define GL_ZERO
Definition: gl.h:374
#define GL_RED
Definition: gl.h:480
#define GL_ONE
Definition: gl.h:375
#define GL_ALPHA
Definition: gl.h:483
#define GL_GREEN
Definition: gl.h:481
GLuint GLenum swizzle
Definition: glext.h:9511
unsigned short x_source
unsigned short w_source
unsigned short y_source
unsigned short z_source

Referenced by create_texture_view(), and wined3d_texture_gl_bind().

◆ wined3d_glsl_blitter_create()

struct wined3d_blitter * wined3d_glsl_blitter_create ( struct wined3d_blitter **  next,
const struct wined3d_device *  device 
)

Definition at line 13210 of file glsl_shader.c.

13212{
13213 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
13215
13216 if (device->shader_backend != &glsl_shader_backend)
13217 return NULL;
13218
13219 if (!gl_info->supported[ARB_VERTEX_SHADER] || !gl_info->supported[ARB_FRAGMENT_SHADER])
13220 return NULL;
13221
13222 if (!(blitter = malloc(sizeof(*blitter))))
13223 {
13224 ERR("Failed to allocate blitter.\n");
13225 return NULL;
13226 }
13227
13228 TRACE("Created blitter %p.\n", blitter);
13229
13230 blitter->blitter.ops = &glsl_blitter_ops;
13231 blitter->blitter.next = *next;
13232 string_buffer_list_init(&blitter->string_buffers);
13234 blitter->palette_texture = 0;
13235 *next = &blitter->blitter;
13236
13237 return *next;
13238}
void string_buffer_list_init(struct wined3d_string_buffer_list *list)
Definition: shader.c:539
const struct wined3d_shader_backend_ops glsl_shader_backend
static int glsl_blitter_args_compare(const void *key, const struct wine_rb_entry *entry)
static const struct wined3d_blitter_ops glsl_blitter_ops
#define wine_rb_init
Definition: rbtree.h:406
struct wined3d_blitter blitter

Referenced by wined3d_device_gl_create_primary_opengl_context_cs().

◆ wined3d_query_gl_create()

HRESULT wined3d_query_gl_create ( struct wined3d_device *  device,
enum wined3d_query_type  type,
void *  parent,
const struct wined3d_parent_ops *  parent_ops,
struct wined3d_query **  query 
)

Definition at line 1309 of file query.c.

1311{
1312 TRACE("device %p, type %#x, parent %p, parent_ops %p, query %p.\n",
1313 device, type, parent, parent_ops, query);
1314
1315 switch (type)
1316 {
1318 return wined3d_event_query_create(device, type, parent, parent_ops, query);
1319
1321 return wined3d_occlusion_query_create(device, type, parent, parent_ops, query);
1322
1324 return wined3d_timestamp_query_create(device, type, parent, parent_ops, query);
1325
1329
1336
1338 return wined3d_pipeline_query_create(device, type, parent, parent_ops, query);
1339
1340 default:
1341 FIXME("Unhandled query type %#x.\n", type);
1343 }
1344}
static HRESULT wined3d_timestamp_disjoint_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1168
static HRESULT wined3d_pipeline_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1281
static HRESULT wined3d_timestamp_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1128
static HRESULT wined3d_so_statistics_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1224
static HRESULT wined3d_event_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1038
static HRESULT wined3d_occlusion_query_create(struct wined3d_device *device, enum wined3d_query_type type, void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_query **query)
Definition: query.c:1084
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
#define WINED3DERR_NOTAVAILABLE
Definition: wined3d.h:42
@ WINED3D_QUERY_TYPE_TIMESTAMP_FREQ
Definition: wined3d.h:733
@ WINED3D_QUERY_TYPE_SO_STATISTICS_STREAM2
Definition: wined3d.h:746
@ WINED3D_QUERY_TYPE_SO_STATISTICS
Definition: wined3d.h:742
@ WINED3D_QUERY_TYPE_PIPELINE_STATISTICS
Definition: wined3d.h:741
@ WINED3D_QUERY_TYPE_SO_STATISTICS_STREAM0
Definition: wined3d.h:744
@ WINED3D_QUERY_TYPE_SO_STATISTICS_STREAM1
Definition: wined3d.h:745
@ WINED3D_QUERY_TYPE_TIMESTAMP
Definition: wined3d.h:731
@ WINED3D_QUERY_TYPE_EVENT
Definition: wined3d.h:729
@ WINED3D_QUERY_TYPE_TIMESTAMP_DISJOINT
Definition: wined3d.h:732
@ WINED3D_QUERY_TYPE_OCCLUSION
Definition: wined3d.h:730
@ WINED3D_QUERY_TYPE_SO_STATISTICS_STREAM3
Definition: wined3d.h:747

Referenced by adapter_gl_create_query().

◆ wined3d_query_gl_destroy_buffer_object()

void wined3d_query_gl_destroy_buffer_object ( struct wined3d_context_gl *  context_gl,
struct wined3d_query *  query 
)

Definition at line 56 of file query.c.

57{
58 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
59
60 GL_EXTCALL(glDeleteBuffers(1, &query->buffer_object));
61 checkGLcall("query buffer object destruction");
62
63 query->buffer_object = 0;
64 query->map_ptr = NULL;
65}

Referenced by wined3d_query_buffer_queue_result(), and wined3d_query_gl_destroy_object().

◆ wined3d_raw_blitter_create()

void wined3d_raw_blitter_create ( struct wined3d_blitter **  next,
const struct wined3d_gl_info *  gl_info 
)

Definition at line 6262 of file texture.c.

6263{
6264 struct wined3d_blitter *blitter;
6265
6266 if (!gl_info->supported[ARB_COPY_IMAGE])
6267 return;
6268
6269 if (!(blitter = malloc(sizeof(*blitter))))
6270 return;
6271
6272 TRACE("Created blitter %p.\n", blitter);
6273
6274 blitter->ops = &raw_blitter_ops;
6275 blitter->next = *next;
6276 *next = blitter;
6277}
static const struct wined3d_blitter_ops raw_blitter_ops
Definition: texture.c:6255

Referenced by wined3d_device_gl_create_primary_opengl_context_cs().

◆ wined3d_rendertarget_view_gl()

Definition at line 1069 of file wined3d_gl.h.

1071{
1073}
const GLdouble * v
Definition: gl.h:2040

◆ wined3d_rendertarget_view_gl_init()

HRESULT wined3d_rendertarget_view_gl_init ( struct wined3d_rendertarget_view_gl *  view_gl,
const struct wined3d_view_desc *  desc,
struct wined3d_resource *  resource,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 659 of file view.c.

662{
663 HRESULT hr;
664
665 TRACE("view_gl %p, desc %s, resource %p, parent %p, parent_ops %p.\n",
666 view_gl, wined3d_debug_view_desc(desc, resource), resource, parent, parent_ops);
667
668 if (FAILED(hr = wined3d_rendertarget_view_init(&view_gl->v, desc, resource, parent, parent_ops)))
669 return hr;
670
672
673 return hr;
674}
void wined3d_cs_init_object(struct wined3d_cs *cs, void(*callback)(void *object), void *object)
Definition: cs.c:2304
const char * wined3d_debug_view_desc(const struct wined3d_view_desc *d, const struct wined3d_resource *resource)
Definition: utils.c:4867
static void wined3d_render_target_view_gl_cs_init(void *object)
Definition: view.c:556
static HRESULT wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:602

Referenced by adapter_gl_create_rendertarget_view().

◆ wined3d_resource_gl_legacy_map_flags()

GLenum wined3d_resource_gl_legacy_map_flags ( DWORD  d3d_flags)

Definition at line 391 of file resource.c.

392{
393 switch (d3d_flags & (WINED3D_MAP_READ | WINED3D_MAP_WRITE))
394 {
395 case WINED3D_MAP_READ:
396 return GL_READ_ONLY_ARB;
397
399 return GL_WRITE_ONLY_ARB;
400
401 default:
402 return GL_READ_WRITE_ARB;
403 }
404}
#define GL_WRITE_ONLY_ARB
Definition: glext.h:1501
#define GL_READ_WRITE_ARB
Definition: glext.h:1502
#define GL_READ_ONLY_ARB
Definition: glext.h:1500
#define WINED3D_MAP_WRITE
Definition: wined3d.h:956

Referenced by wined3d_bo_gl_map().

◆ wined3d_resource_gl_map_flags()

GLbitfield wined3d_resource_gl_map_flags ( const struct wined3d_bo_gl *  bo,
DWORD  d3d_flags 
)

Definition at line 373 of file resource.c.

374{
375 GLbitfield ret = 0;
376
377 if (d3d_flags & WINED3D_MAP_WRITE)
378 {
380 if (!bo->b.coherent)
382 }
383 if (d3d_flags & WINED3D_MAP_READ)
385 else
387
388 return ret;
389}
#define GL_MAP_FLUSH_EXPLICIT_BIT
Definition: glext.h:1797
#define GL_MAP_UNSYNCHRONIZED_BIT
Definition: glext.h:1798

Referenced by wined3d_bo_gl_map().

◆ wined3d_resource_gl_storage_flags()

GLbitfield wined3d_resource_gl_storage_flags ( const struct wined3d_resource *  resource)

Definition at line 355 of file resource.c.

356{
357 uint32_t access = resource->access;
358 GLbitfield flags = 0;
359
360 if (resource->usage & WINED3DUSAGE_DYNAMIC)
363 {
368 }
369
370 return flags;
371}
GLuint GLint GLboolean GLint GLenum access
Definition: glext.h:7866
#define WINED3D_RESOURCE_ACCESS_CPU
Definition: wined3d.h:52
#define WINED3D_RESOURCE_ACCESS_MAP_R
Definition: wined3d.h:53
#define WINED3D_RESOURCE_ACCESS_MAP_W
Definition: wined3d.h:54

Referenced by adapter_gl_alloc_bo(), and wined3d_buffer_gl_create_buffer_object().

◆ wined3d_sampler_gl()

static struct wined3d_sampler_gl * wined3d_sampler_gl ( struct wined3d_sampler *  sampler)
inlinestatic

Definition at line 1034 of file wined3d_gl.h.

1035{
1037}
GLdouble s
Definition: gl.h:2039
GLuint sampler
Definition: glext.h:7283

◆ wined3d_sampler_gl_bind()

void wined3d_sampler_gl_bind ( struct wined3d_sampler_gl *  sampler_gl,
unsigned int  unit,
struct wined3d_texture_gl *  texture_gl,
const struct wined3d_context_gl *  context_gl 
)

Definition at line 320 of file sampler.c.

322{
323 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
324
325 if (gl_info->supported[ARB_SAMPLER_OBJECTS])
326 {
327 GL_EXTCALL(glBindSampler(unit, sampler_gl->name));
328 checkGLcall("bind sampler");
329 }
330 else if (texture_gl)
331 {
332 wined3d_texture_gl_apply_sampler_desc(texture_gl, &sampler_gl->s.desc, context_gl);
333 }
334 else
335 {
336 ERR("Could not apply sampler state.\n");
337 }
338
339 if (texture_gl)
340 texture_gl_apply_base_level(texture_gl, &sampler_gl->s.desc, gl_info);
341}
void wined3d_texture_gl_apply_sampler_desc(struct wined3d_texture_gl *texture_gl, const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context_gl *context_gl)
Definition: texture.c:1418
static void texture_gl_apply_base_level(struct wined3d_texture_gl *texture_gl, const struct wined3d_sampler_desc *desc, const struct wined3d_gl_info *gl_info)
Definition: sampler.c:306
struct wined3d_sampler s
Definition: wined3d_gl.h:1029

Referenced by wined3d_shader_resource_view_gl_bind().

◆ wined3d_sampler_gl_init()

void wined3d_sampler_gl_init ( struct wined3d_sampler_gl *  sampler_gl,
struct wined3d_device *  device,
const struct wined3d_sampler_desc *  desc,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 130 of file sampler.c.

132{
133 TRACE("sampler_gl %p, device %p, desc %p, parent %p, parent_ops %p.\n",
134 sampler_gl, device, desc, parent, parent_ops);
135
136 wined3d_sampler_init(&sampler_gl->s, device, desc, parent, parent_ops);
137
138 if (wined3d_adapter_gl(device->adapter)->gl_info.supported[ARB_SAMPLER_OBJECTS])
140}
static void wined3d_sampler_gl_cs_init(void *object)
Definition: sampler.c:84
static void wined3d_sampler_init(struct wined3d_sampler *sampler, struct wined3d_device *device, const struct wined3d_sampler_desc *desc, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: sampler.c:58

Referenced by adapter_gl_create_sampler().

◆ wined3d_shader_resource_view_gl()

◆ wined3d_shader_resource_view_gl_bind()

void wined3d_shader_resource_view_gl_bind ( struct wined3d_shader_resource_view_gl *  view_gl,
unsigned int  unit,
struct wined3d_sampler_gl *  sampler_gl,
struct wined3d_context_gl *  context_gl 
)

Definition at line 1274 of file view.c.

1276{
1277 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1278 struct wined3d_texture_gl *texture_gl;
1279
1280 wined3d_context_gl_active_texture(context_gl, gl_info, unit);
1281
1282 if (view_gl->gl_view.name)
1283 {
1284 wined3d_context_gl_bind_texture(context_gl, view_gl->gl_view.target, view_gl->gl_view.name);
1285 wined3d_sampler_gl_bind(sampler_gl, unit, NULL, context_gl);
1286 return;
1287 }
1288
1289 if (view_gl->v.resource->type == WINED3D_RTYPE_BUFFER)
1290 {
1291 FIXME("Buffer shader resources not supported.\n");
1292 return;
1293 }
1294
1295 texture_gl = wined3d_texture_gl(wined3d_texture_from_resource(view_gl->v.resource));
1296 wined3d_texture_gl_bind(texture_gl, context_gl, sampler_gl->s.desc.srgb_decode);
1297 wined3d_sampler_gl_bind(sampler_gl, unit, texture_gl, context_gl);
1298}
struct wined3d_texture *__cdecl wined3d_texture_from_resource(struct wined3d_resource *resource)
Definition: texture.c:3343
void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb)
Definition: texture.c:1288
void wined3d_sampler_gl_bind(struct wined3d_sampler_gl *sampler_gl, unsigned int unit, struct wined3d_texture_gl *texture_gl, const struct wined3d_context_gl *context_gl)
Definition: sampler.c:320
struct wined3d_shader_resource_view v
Definition: wined3d_gl.h:1081
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1083
@ WINED3D_RTYPE_BUFFER
Definition: wined3d.h:718

Referenced by wined3d_context_gl_bind_shader_resources().

◆ wined3d_shader_resource_view_gl_generate_mipmap()

void wined3d_shader_resource_view_gl_generate_mipmap ( struct wined3d_shader_resource_view_gl *  srv_gl,
struct wined3d_context_gl *  context_gl 
)

Definition at line 1312 of file view.c.

1314{
1315 unsigned int i, j, layer_count, level_count, base_level, base_layer, sub_resource_idx;
1316 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1317 struct wined3d_texture_gl *texture_gl;
1318 struct gl_texture *gl_tex;
1320 BOOL srgb;
1321
1322 TRACE("view_gl %p.\n", view_gl);
1323
1324 layer_count = view_gl->v.desc.u.texture.layer_count;
1325 level_count = view_gl->v.desc.u.texture.level_count;
1326 base_level = view_gl->v.desc.u.texture.level_idx;
1327 base_layer = view_gl->v.desc.u.texture.layer_idx;
1328
1329 texture_gl = wined3d_texture_gl(texture_from_resource(view_gl->v.resource));
1330 srgb = !!(texture_gl->t.flags & WINED3D_TEXTURE_IS_SRGB);
1332 for (i = 0; i < layer_count; ++i)
1333 {
1334 sub_resource_idx = (base_layer + i) * texture_gl->t.level_count + base_level;
1335 if (!wined3d_texture_load_location(&texture_gl->t, sub_resource_idx, &context_gl->c, location))
1336 ERR("Failed to load source layer %u.\n", base_layer + i);
1337 }
1338
1339 if (view_gl->gl_view.name)
1340 {
1341 shader_resource_view_gl_bind_and_dirtify(view_gl, context_gl);
1342 }
1343 else
1344 {
1345 wined3d_texture_gl_bind_and_dirtify(texture_gl, context_gl, srgb);
1346 gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target, GL_TEXTURE_BASE_LEVEL, base_level);
1347 gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target, GL_TEXTURE_MAX_LEVEL, base_level + level_count - 1);
1348 }
1349
1350 if (gl_info->supported[ARB_SAMPLER_OBJECTS])
1351 GL_EXTCALL(glBindSampler(context_gl->active_texture, 0));
1352 gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
1353 if (context_gl->c.d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL
1355 {
1356 gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target,
1358 gl_tex->sampler_desc.srgb_decode = FALSE;
1359 }
1360
1361 gl_info->fbo_ops.glGenerateMipmap(texture_gl->target);
1362 checkGLcall("glGenerateMipMap()");
1363
1364 for (i = 0; i < layer_count; ++i)
1365 {
1366 for (j = 1; j < level_count; ++j)
1367 {
1368 sub_resource_idx = (base_layer + i) * texture_gl->t.level_count + base_level + j;
1369 wined3d_texture_validate_location(&texture_gl->t, sub_resource_idx, location);
1370 wined3d_texture_invalidate_location(&texture_gl->t, sub_resource_idx, ~location);
1371 }
1372 }
1373
1374 if (!view_gl->gl_view.name)
1375 {
1376 gl_tex->sampler_desc.mip_base_level = base_level;
1377 gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target,
1378 GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
1379 }
1380}
void wined3d_texture_invalidate_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, uint32_t location)
Definition: texture.c:702
void wined3d_texture_gl_bind_and_dirtify(struct wined3d_texture_gl *texture_gl, struct wined3d_context_gl *context_gl, BOOL srgb)
Definition: texture.c:1405
void wined3d_texture_validate_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, uint32_t location)
Definition: texture.c:678
BOOL wined3d_texture_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, uint32_t location)
Definition: texture.c:770
static void shader_resource_view_gl_bind_and_dirtify(struct wined3d_shader_resource_view_gl *view_gl, struct wined3d_context_gl *context_gl)
Definition: view.c:1301
unsigned long DWORD
Definition: ntddk_ex.h:95
#define GL_TEXTURE_BASE_LEVEL
Definition: gl.h:1503
#define GL_SKIP_DECODE_EXT
Definition: glext.h:5291
#define GL_TEXTURE_SRGB_DECODE_EXT
Definition: glext.h:5289
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define location(file, line)
Definition: kmtest.h:18
struct wined3d_sampler_desc sampler_desc
Definition: wined3d_gl.h:928
#define WINED3D_SRGB_READ_WRITE_CONTROL
Definition: wined3d.h:1330
static struct gl_texture * wined3d_texture_gl_get_gl_texture(struct wined3d_texture_gl *texture_gl, bool srgb)
Definition: wined3d_gl.h:959
#define WINED3D_LOCATION_TEXTURE_SRGB
#define WINED3D_LOCATION_TEXTURE_RGB
static struct wined3d_texture * texture_from_resource(struct wined3d_resource *resource)
#define WINED3D_TEXTURE_IS_SRGB

Referenced by adapter_gl_generate_mipmap().

◆ wined3d_shader_resource_view_gl_init()

HRESULT wined3d_shader_resource_view_gl_init ( struct wined3d_shader_resource_view_gl *  view_gl,
const struct wined3d_view_desc *  desc,
struct wined3d_resource *  resource,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 1121 of file view.c.

1124{
1125 HRESULT hr;
1126
1127 TRACE("view_gl %p, desc %s, resource %p, parent %p, parent_ops %p.\n",
1128 view_gl, wined3d_debug_view_desc(desc, resource), resource, parent, parent_ops);
1129
1130 if (FAILED(hr = wined3d_shader_resource_view_init(&view_gl->v, desc, resource, parent, parent_ops)))
1131 return hr;
1132
1133 list_init(&view_gl->bo_user.entry);
1135
1136 return hr;
1137}
static void wined3d_shader_resource_view_gl_cs_init(void *object)
Definition: view.c:1035
static HRESULT wined3d_shader_resource_view_init(struct wined3d_shader_resource_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:1098
struct wined3d_bo_user bo_user
Definition: wined3d_gl.h:1082

Referenced by adapter_gl_create_shader_resource_view().

◆ wined3d_shader_resource_view_gl_update()

void wined3d_shader_resource_view_gl_update ( struct wined3d_shader_resource_view_gl *  srv_gl,
struct wined3d_context_gl *  context_gl 
)

Definition at line 1023 of file view.c.

1025{
1026 struct wined3d_buffer *buffer = buffer_from_resource(srv_gl->v.resource);
1027
1028 assert(!srv_gl->bo_user.valid);
1029
1030 create_buffer_view(&srv_gl->gl_view, &context_gl->c, &srv_gl->v.desc, buffer, srv_gl->v.format);
1031 srv_gl->bo_user.valid = true;
1032 list_add_head(&buffer->buffer_object->users, &srv_gl->bo_user.entry);
1033}
static void create_buffer_view(struct wined3d_gl_view *view, struct wined3d_context *context, const struct wined3d_view_desc *desc, struct wined3d_buffer *buffer, const struct wined3d_format *view_format)
Definition: view.c:307
static struct wined3d_buffer * buffer_from_resource(struct wined3d_resource *resource)

Referenced by context_gl_load_shader_resources().

◆ wined3d_swapchain_gl()

Definition at line 1129 of file wined3d_gl.h.

1130{
1131 return CONTAINING_RECORD(swapchain, struct wined3d_swapchain_gl, s);
1132}

◆ wined3d_swapchain_gl_cleanup()

void wined3d_swapchain_gl_cleanup ( struct wined3d_swapchain_gl *  swapchain_gl)

Definition at line 91 of file swapchain.c.

92{
93 wined3d_swapchain_cleanup(&swapchain_gl->s);
94}
void wined3d_swapchain_cleanup(struct wined3d_swapchain *swapchain)
Definition: swapchain.c:30

Referenced by adapter_gl_destroy_swapchain().

◆ wined3d_swapchain_gl_get_context()

struct wined3d_context_gl * wined3d_swapchain_gl_get_context ( struct wined3d_swapchain_gl *  swapchain_gl)

Definition at line 1798 of file swapchain.c.

1799{
1800 struct wined3d_device *device = swapchain_gl->s.device;
1802 unsigned int i;
1803
1804 for (i = 0; i < device->context_count; ++i)
1805 {
1806 if (wined3d_context_gl(device->contexts[i])->tid == tid)
1807 return wined3d_context_gl(device->contexts[i]);
1808 }
1809
1810 /* Create a new context for the thread. */
1811 return wined3d_swapchain_gl_create_context(swapchain_gl);
1812}
static TfClientId tid
static struct wined3d_context_gl * wined3d_swapchain_gl_create_context(struct wined3d_swapchain_gl *swapchain_gl)
Definition: swapchain.c:1762

Referenced by wined3d_context_gl_acquire().

◆ wined3d_swapchain_gl_init()

HRESULT wined3d_swapchain_gl_init ( struct wined3d_swapchain_gl *  swapchain_gl,
struct wined3d_device *  device,
const struct wined3d_swapchain_desc *  desc,
struct wined3d_swapchain_state_parent *  state_parent,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 1696 of file swapchain.c.

1699{
1700 TRACE("swapchain_gl %p, device %p, desc %p, state_parent %p, parent %p, parent_ops %p.\n",
1701 swapchain_gl, device, desc, state_parent, parent, parent_ops);
1702
1703 return wined3d_swapchain_init(&swapchain_gl->s, device, desc, state_parent, parent,
1704 parent_ops, &swapchain_gl_ops);
1705}
static HRESULT wined3d_swapchain_init(struct wined3d_swapchain *swapchain, struct wined3d_device *device, const struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent, void *parent, const struct wined3d_parent_ops *parent_ops, const struct wined3d_swapchain_ops *swapchain_ops)
Definition: swapchain.c:1506
static const struct wined3d_swapchain_ops swapchain_gl_ops
Definition: swapchain.c:654

Referenced by adapter_gl_create_swapchain().

◆ wined3d_texture_get_gl_buffer()

GLenum wined3d_texture_get_gl_buffer ( const struct wined3d_texture *  texture)

Definition at line 113 of file texture.c.

114{
115 const struct wined3d_swapchain *swapchain = texture->swapchain;
116
117 TRACE("texture %p.\n", texture);
118
119 if (!swapchain)
120 {
121 ERR("Texture %p is not part of a swapchain.\n", texture);
122 return GL_NONE;
123 }
124
125 if (texture == swapchain->front_buffer)
126 {
127 TRACE("Returning GL_FRONT.\n");
128 return GL_FRONT;
129 }
130
131 if (texture == swapchain->back_buffers[0])
132 {
133 TRACE("Returning GL_BACK.\n");
134 return GL_BACK;
135 }
136
137 FIXME("Higher back buffer, returning GL_BACK.\n");
138 return GL_BACK;
139}
#define GL_FRONT
Definition: gl.h:270

Referenced by context_generate_rt_mask_from_resource(), texture2d_blt_fbo(), and texture2d_read_from_framebuffer().

◆ wined3d_texture_gl()

static struct wined3d_texture_gl * wined3d_texture_gl ( struct wined3d_texture *  texture)
inlinestatic

Definition at line 954 of file wined3d_gl.h.

955{
957}
GLdouble GLdouble t
Definition: gl.h:2047

◆ wined3d_texture_gl_apply_sampler_desc()

void wined3d_texture_gl_apply_sampler_desc ( struct wined3d_texture_gl *  texture_gl,
const struct wined3d_sampler_desc *  sampler_desc,
const struct wined3d_context_gl *  context_gl 
)

Definition at line 1418 of file texture.c.

1420{
1421 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1422 GLenum target = texture_gl->target;
1423 struct gl_texture *gl_tex;
1424 DWORD state;
1425
1426 TRACE("texture_gl %p, sampler_desc %p, context_gl %p.\n", texture_gl, sampler_desc, context_gl);
1427
1428 gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, texture_gl->t.flags & WINED3D_TEXTURE_IS_SRGB);
1429
1430 state = sampler_desc->address_u;
1431 if (state != gl_tex->sampler_desc.address_u)
1432 {
1433 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_S,
1435 gl_tex->sampler_desc.address_u = state;
1436 }
1437
1438 state = sampler_desc->address_v;
1439 if (state != gl_tex->sampler_desc.address_v)
1440 {
1441 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_T,
1443 gl_tex->sampler_desc.address_v = state;
1444 }
1445
1446 state = sampler_desc->address_w;
1447 if (state != gl_tex->sampler_desc.address_w)
1448 {
1449 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_R,
1451 gl_tex->sampler_desc.address_w = state;
1452 }
1453
1454 if (memcmp(gl_tex->sampler_desc.border_color, sampler_desc->border_color,
1455 sizeof(gl_tex->sampler_desc.border_color)))
1456 {
1457 gl_info->gl_ops.gl.p_glTexParameterfv(target, GL_TEXTURE_BORDER_COLOR, &sampler_desc->border_color[0]);
1458 memcpy(gl_tex->sampler_desc.border_color, sampler_desc->border_color,
1459 sizeof(gl_tex->sampler_desc.border_color));
1460 }
1461
1462 state = sampler_desc->mag_filter;
1463 if (state != gl_tex->sampler_desc.mag_filter)
1464 {
1465 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAG_FILTER, wined3d_gl_mag_filter(state));
1466 gl_tex->sampler_desc.mag_filter = state;
1467 }
1468
1469 if (sampler_desc->min_filter != gl_tex->sampler_desc.min_filter
1470 || sampler_desc->mip_filter != gl_tex->sampler_desc.mip_filter)
1471 {
1472 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MIN_FILTER,
1473 wined3d_gl_min_mip_filter(sampler_desc->min_filter, sampler_desc->mip_filter));
1474 gl_tex->sampler_desc.min_filter = sampler_desc->min_filter;
1475 gl_tex->sampler_desc.mip_filter = sampler_desc->mip_filter;
1476 }
1477
1478 state = sampler_desc->max_anisotropy;
1479 if (state != gl_tex->sampler_desc.max_anisotropy)
1480 {
1482 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAX_ANISOTROPY, state);
1483 else
1484 WARN("Anisotropic filtering not supported.\n");
1485 gl_tex->sampler_desc.max_anisotropy = state;
1486 }
1487
1488 if (!sampler_desc->srgb_decode != !gl_tex->sampler_desc.srgb_decode
1489 && (context_gl->c.d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
1491 {
1492 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_SRGB_DECODE_EXT,
1494 gl_tex->sampler_desc.srgb_decode = sampler_desc->srgb_decode;
1495 }
1496
1497 if (!sampler_desc->compare != !gl_tex->sampler_desc.compare)
1498 {
1499 if (sampler_desc->compare)
1501 else
1502 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
1503 gl_tex->sampler_desc.compare = sampler_desc->compare;
1504 }
1505
1506 checkGLcall("Texture parameter application");
1507
1508 if (gl_info->supported[EXT_TEXTURE_LOD_BIAS])
1509 {
1510 gl_info->gl_ops.gl.p_glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT,
1512 checkGLcall("glTexEnvf(GL_TEXTURE_LOD_BIAS_EXT, ...)");
1513 }
1514}
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
#define GL_TEXTURE_MIN_FILTER
Definition: gl.h:649
#define GL_TEXTURE_BORDER_COLOR
Definition: gl.h:656
#define GL_TEXTURE_WRAP_R
Definition: gl.h:1518
#define GL_TEXTURE_WRAP_S
Definition: gl.h:646
#define GL_TEXTURE_WRAP_T
Definition: gl.h:647
#define GL_TEXTURE_MAG_FILTER
Definition: gl.h:648
#define GL_DECODE_EXT
Definition: glext.h:5290
#define GL_TEXTURE_COMPARE_MODE_ARB
Definition: glext.h:1371
#define GL_TEXTURE_LOD_BIAS_EXT
Definition: glext.h:3362
#define GL_COMPARE_R_TO_TEXTURE_ARB
Definition: glext.h:1373
#define GL_TEXTURE_FILTER_CONTROL_EXT
Definition: glext.h:3361
GLint wrap_lookup[WINED3D_TADDRESS_MIRROR_ONCE - WINED3D_TADDRESS_WRAP+1]
Definition: wined3d_gl.h:348
#define GL_TEXTURE_MAX_ANISOTROPY
Definition: wgl.h:4461
@ WINED3D_TADDRESS_WRAP
Definition: wined3d.h:658
static GLenum wined3d_gl_mag_filter(enum wined3d_texture_filter_type mag_filter)
Definition: wined3d_gl.h:377
static GLenum wined3d_gl_min_mip_filter(enum wined3d_texture_filter_type min_filter, enum wined3d_texture_filter_type mip_filter)
Definition: wined3d_gl.h:382

Referenced by wined3d_sampler_gl_bind().

◆ wined3d_texture_gl_bind()

void wined3d_texture_gl_bind ( struct wined3d_texture_gl *  texture_gl,
struct wined3d_context_gl *  context_gl,
BOOL  srgb 
)

Definition at line 1288 of file texture.c.

1290{
1291 const struct wined3d_format *format = texture_gl->t.resource.format;
1292 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1293 const struct color_fixup_desc fixup = format->color_fixup;
1294 struct gl_texture *gl_tex;
1295 GLenum target;
1296
1297 TRACE("texture_gl %p, context_gl %p, srgb %#x.\n", texture_gl, context_gl, srgb);
1298
1299 if (!needs_separate_srgb_gl_texture(&context_gl->c, &texture_gl->t))
1300 srgb = FALSE;
1301
1302 /* sRGB mode cache for preload() calls outside drawprim. */
1303 if (srgb)
1304 texture_gl->t.flags |= WINED3D_TEXTURE_IS_SRGB;
1305 else
1306 texture_gl->t.flags &= ~WINED3D_TEXTURE_IS_SRGB;
1307
1308 gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
1309 target = texture_gl->target;
1310
1311 if (gl_tex->name)
1312 {
1313 wined3d_context_gl_bind_texture(context_gl, target, gl_tex->name);
1314 return;
1315 }
1316
1317 gl_info->gl_ops.gl.p_glGenTextures(1, &gl_tex->name);
1318 checkGLcall("glGenTextures");
1319 TRACE("Generated texture %d.\n", gl_tex->name);
1320
1321 if (!gl_tex->name)
1322 {
1323 ERR("Failed to generate a texture name.\n");
1324 return;
1325 }
1326
1327 /* Initialise the state of the texture object to the OpenGL defaults, not
1328 * the wined3d defaults. */
1329 gl_tex->sampler_desc.address_u = WINED3D_TADDRESS_WRAP;
1330 gl_tex->sampler_desc.address_v = WINED3D_TADDRESS_WRAP;
1331 gl_tex->sampler_desc.address_w = WINED3D_TADDRESS_WRAP;
1332 memset(gl_tex->sampler_desc.border_color, 0, sizeof(gl_tex->sampler_desc.border_color));
1333 gl_tex->sampler_desc.mag_filter = WINED3D_TEXF_LINEAR;
1334 gl_tex->sampler_desc.min_filter = WINED3D_TEXF_POINT; /* GL_NEAREST_MIPMAP_LINEAR */
1335 gl_tex->sampler_desc.mip_filter = WINED3D_TEXF_LINEAR; /* GL_NEAREST_MIPMAP_LINEAR */
1336 gl_tex->sampler_desc.lod_bias = 0.0f;
1337 gl_tex->sampler_desc.min_lod = -1000.0f;
1338 gl_tex->sampler_desc.max_lod = 1000.0f;
1339 gl_tex->sampler_desc.max_anisotropy = 1;
1340 gl_tex->sampler_desc.compare = FALSE;
1341 gl_tex->sampler_desc.comparison_func = WINED3D_CMP_LESSEQUAL;
1342 if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
1343 gl_tex->sampler_desc.srgb_decode = TRUE;
1344 else
1345 gl_tex->sampler_desc.srgb_decode = srgb;
1346 gl_tex->sampler_desc.mip_base_level = 0;
1347 wined3d_texture_set_dirty(&texture_gl->t);
1348
1349 wined3d_context_gl_bind_texture(context_gl, target, gl_tex->name);
1350
1351 /* For a new texture we have to set the texture levels after binding the
1352 * texture. */
1353 TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", texture_gl->t.level_count - 1);
1354 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
1355 checkGLcall("glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texture->level_count)");
1356
1358 {
1359 /* Cubemaps are always set to clamp, regardless of the sampler state. */
1360 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1361 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1362 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1363 }
1364
1365 if (texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2 && target != GL_TEXTURE_2D_MULTISAMPLE
1367 {
1368 /* Conditional non power of two textures use a different clamping
1369 * default. If we're using the GL_WINE_normalized_texrect partial
1370 * driver emulation, we're dealing with a GL_TEXTURE_2D texture which
1371 * has the address mode set to repeat - something that prevents us
1372 * from hitting the accelerated codepath. Thus manually set the GL
1373 * state. The same applies to filtering. Even if the texture has only
1374 * one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW
1375 * fallback on macos. */
1376 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1377 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1378 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1379 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1380 checkGLcall("glTexParameteri");
1381 gl_tex->sampler_desc.address_u = WINED3D_TADDRESS_CLAMP;
1382 gl_tex->sampler_desc.address_v = WINED3D_TADDRESS_CLAMP;
1383 gl_tex->sampler_desc.mag_filter = WINED3D_TEXF_POINT;
1384 gl_tex->sampler_desc.min_filter = WINED3D_TEXF_POINT;
1385 gl_tex->sampler_desc.mip_filter = WINED3D_TEXF_NONE;
1386 }
1387
1389 {
1390 gl_info->gl_ops.gl.p_glTexParameteri(target, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);
1391 checkGLcall("glTexParameteri(GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY)");
1392 }
1393
1394 if (!is_identity_fixup(fixup) && can_use_texture_swizzle(context_gl->c.d3d_info, format))
1395 {
1396 GLint swizzle[4];
1397
1399 gl_info->gl_ops.gl.p_glTexParameteriv(target, GL_TEXTURE_SWIZZLE_RGBA, swizzle);
1400 checkGLcall("set format swizzle");
1401 }
1402}
static void wined3d_texture_set_dirty(struct wined3d_texture *texture)
Definition: texture.c:697
void wined3d_gl_texture_swizzle_from_color_fixup(GLint swizzle[4], struct color_fixup_desc fixup)
Definition: texture.c:1269
#define GL_INTENSITY
Definition: gl.h:747
#define GL_NEAREST
Definition: gl.h:678
#define GL_CLAMP_TO_EDGE
Definition: gl.h:1481
#define GL_DEPTH_TEXTURE_MODE_ARB
Definition: glext.h:1367
#define GL_TEXTURE_SWIZZLE_RGBA
Definition: glext.h:2032
GLuint name
Definition: wined3d_gl.h:929
@ WINED3D_TEXF_NONE
Definition: wined3d.h:705
@ WINED3D_TEXF_POINT
Definition: wined3d.h:706
@ WINED3D_TEXF_LINEAR
Definition: wined3d.h:707
@ WINED3D_TADDRESS_CLAMP
Definition: wined3d.h:660
#define WINED3D_TEXTURE_COND_NP2
static BOOL can_use_texture_swizzle(const struct wined3d_d3d_info *d3d_info, const struct wined3d_format *format)
static BOOL is_identity_fixup(struct color_fixup_desc fixup)
static BOOL needs_separate_srgb_gl_texture(const struct wined3d_context *context, const struct wined3d_texture *texture)

Referenced by wined3d_shader_resource_view_gl_bind(), and wined3d_texture_gl_bind_and_dirtify().

◆ wined3d_texture_gl_bind_and_dirtify()

void wined3d_texture_gl_bind_and_dirtify ( struct wined3d_texture_gl *  texture_gl,
struct wined3d_context_gl *  context_gl,
BOOL  srgb 
)

Definition at line 1405 of file texture.c.

1407{
1408 /* FIXME: Ideally we'd only do this when touching a binding that's used by
1409 * a shader. */
1412
1413 wined3d_texture_gl_bind(texture_gl, context_gl, srgb);
1414}

Referenced by wined3d_shader_resource_view_gl_generate_mipmap(), wined3d_texture_gl_download_data(), wined3d_texture_gl_prepare_texture(), and wined3d_texture_gl_upload_data().

◆ wined3d_texture_gl_get_gl_texture()

static struct gl_texture * wined3d_texture_gl_get_gl_texture ( struct wined3d_texture_gl *  texture_gl,
bool  srgb 
)
inlinestatic

Definition at line 959 of file wined3d_gl.h.

960{
961 return srgb ? &texture_gl->texture_srgb : &texture_gl->texture_rgb;
962}

Referenced by texture_gl_apply_base_level(), wined3d_shader_resource_view_gl_generate_mipmap(), wined3d_texture_gl_apply_sampler_desc(), and wined3d_texture_gl_bind().

◆ wined3d_texture_gl_get_sub_resource_target()

static GLenum wined3d_texture_gl_get_sub_resource_target ( const struct wined3d_texture_gl *  texture_gl,
unsigned int  sub_resource_idx 
)
inlinestatic

Definition at line 964 of file wined3d_gl.h.

966{
967 static const GLenum cube_targets[] =
968 {
975 };
976
977 if (texture_gl->t.resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP)
978 return cube_targets[sub_resource_idx / texture_gl->t.level_count];
979 return texture_gl->target;
980}
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
Definition: glext.h:1237
#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB
Definition: glext.h:1232
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB
Definition: glext.h:1234
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB
Definition: glext.h:1235
#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB
Definition: glext.h:1236
#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB
Definition: glext.h:1233
#define WINED3DUSAGE_LEGACY_CUBEMAP
Definition: wined3d.h:934

Referenced by texture2d_get_blt_info(), wined3d_context_gl_set_fbo_key_for_render_target(), wined3d_texture_gl_allocate_mutable_storage(), wined3d_texture_gl_download_data(), wined3d_texture_gl_download_data_slow_path(), and wined3d_texture_gl_upload_data().

◆ wined3d_texture_gl_get_texture_name()

static GLuint wined3d_texture_gl_get_texture_name ( const struct wined3d_texture_gl *  texture_gl,
const struct wined3d_context *  context,
bool  srgb 
)
inlinestatic

Definition at line 982 of file wined3d_gl.h.

984{
985 if (srgb && needs_separate_srgb_gl_texture(context, &texture_gl->t))
986 return texture_gl->texture_srgb.name;
987 return texture_gl->texture_rgb.name;
988}

Referenced by create_texture_view(), raw_blitter_blit(), wined3d_context_gl_bind_unordered_access_views(), and wined3d_context_gl_set_fbo_key_for_render_target().

◆ wined3d_texture_gl_init()

HRESULT wined3d_texture_gl_init ( struct wined3d_texture_gl *  texture_gl,
struct wined3d_device *  device,
const struct wined3d_resource_desc *  desc,
unsigned int  layer_count,
unsigned int  level_count,
uint32_t  flags,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 4083 of file texture.c.

4086{
4087 const struct wined3d_gl_info *gl_info = &wined3d_adapter_gl(device->adapter)->gl_info;
4088 HRESULT hr;
4089
4090 TRACE("texture_gl %p, device %p, desc %p, layer_count %u, "
4091 "level_count %u, flags %#x, parent %p, parent_ops %p.\n",
4092 texture_gl, device, desc, layer_count,
4093 level_count, flags, parent, parent_ops);
4094
4095 if (!(desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) && layer_count > 1
4096 && !gl_info->supported[EXT_TEXTURE_ARRAY])
4097 {
4098 WARN("OpenGL implementation does not support array textures.\n");
4100 }
4101
4102 switch (desc->resource_type)
4103 {
4105 if (layer_count > 1)
4106 texture_gl->target = GL_TEXTURE_1D_ARRAY;
4107 else
4108 texture_gl->target = GL_TEXTURE_1D;
4109 break;
4110
4112 if (desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP)
4113 {
4114 texture_gl->target = GL_TEXTURE_CUBE_MAP_ARB;
4115 }
4116 else if (desc->multisample_type && gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
4117 {
4118 if (layer_count > 1)
4120 else
4121 texture_gl->target = GL_TEXTURE_2D_MULTISAMPLE;
4122 }
4123 else
4124 {
4125 if (layer_count > 1)
4126 texture_gl->target = GL_TEXTURE_2D_ARRAY;
4127 else
4128 texture_gl->target = GL_TEXTURE_2D;
4129 }
4130 break;
4131
4133 if (!gl_info->supported[EXT_TEXTURE3D])
4134 {
4135 WARN("OpenGL implementation does not support 3D textures.\n");
4137 }
4138 texture_gl->target = GL_TEXTURE_3D;
4139 break;
4140
4141 default:
4142 ERR("Invalid resource type %s.\n", debug_d3dresourcetype(desc->resource_type));
4144 }
4145
4146 list_init(&texture_gl->renderbuffers);
4147
4148 if (FAILED(hr = wined3d_texture_init(&texture_gl->t, desc, layer_count, level_count,
4149 flags, device, parent, parent_ops, &texture_gl[1], &texture_gl_ops)))
4150 return hr;
4151
4152 if (texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY || texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE)
4153 texture_gl->t.flags &= ~WINED3D_TEXTURE_DOWNLOADABLE;
4154
4155 return WINED3D_OK;
4156}
static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count, uint32_t flags, struct wined3d_device *device, void *parent, const struct wined3d_parent_ops *parent_ops, void *sub_resources, const struct wined3d_texture_ops *texture_ops)
Definition: texture.c:3620
static const struct wined3d_texture_ops texture_gl_ops
Definition: texture.c:34
const char * debug_d3dresourcetype(enum wined3d_resource_type resource_type)
Definition: utils.c:4992
struct list renderbuffers
Definition: wined3d_gl.h:950
@ WINED3D_RTYPE_TEXTURE_2D
Definition: wined3d.h:720
@ WINED3D_RTYPE_TEXTURE_1D
Definition: wined3d.h:719
@ WINED3D_RTYPE_TEXTURE_3D
Definition: wined3d.h:721
#define WINED3DERR_INVALIDCALL
Definition: wined3d.h:44

Referenced by adapter_gl_create_texture().

◆ wined3d_texture_gl_is_multisample_location()

static bool wined3d_texture_gl_is_multisample_location ( const struct wined3d_texture_gl *  texture_gl,
uint32_t  location 
)
inlinestatic

Definition at line 990 of file wined3d_gl.h.

992{
994 return true;
996 return false;
997 return texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE || texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
998}
#define WINED3D_LOCATION_RB_MULTISAMPLE

Referenced by texture2d_blt_fbo(), and wined3d_texture_gl_load_sysmem().

◆ wined3d_texture_gl_prepare_texture()

void wined3d_texture_gl_prepare_texture ( struct wined3d_texture_gl *  texture_gl,
struct wined3d_context_gl *  context_gl,
BOOL  srgb 
)

Definition at line 2029 of file texture.c.

2031{
2033 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
2034 struct wined3d_resource *resource = &texture_gl->t.resource;
2035 const struct wined3d_device *device = resource->device;
2036 const struct wined3d_format *format = resource->format;
2037 const struct wined3d_color_key_conversion *conversion;
2038 const struct wined3d_format_gl *format_gl;
2040
2041 TRACE("texture_gl %p, context_gl %p, srgb %d, format %s.\n",
2042 texture_gl, context_gl, srgb, debug_d3dformat(format->id));
2043
2044 if (texture_gl->t.flags & alloc_flag)
2045 return;
2046
2047 if (resource->format_caps & WINED3D_FORMAT_CAP_DECOMPRESS)
2048 {
2049 TRACE("WINED3D_FORMAT_CAP_DECOMPRESS set.\n");
2050 texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED;
2052 }
2053 else if (format->conv_byte_count)
2054 {
2055 texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED;
2056 }
2057 else if ((conversion = wined3d_format_get_color_key_conversion(&texture_gl->t, TRUE)))
2058 {
2059 texture_gl->t.flags |= WINED3D_TEXTURE_CONVERTED;
2060 format = wined3d_get_format(device->adapter, conversion->dst_format, resource->bind_flags);
2061 TRACE("Using format %s for color key conversion.\n", debug_d3dformat(format->id));
2062 }
2063 format_gl = wined3d_format_gl(format);
2064
2065 wined3d_texture_gl_bind_and_dirtify(texture_gl, context_gl, srgb);
2066
2068 if (!internal)
2069 FIXME("No GL internal format for format %s.\n", debug_d3dformat(format->id));
2070
2071 TRACE("internal %#x, format %#x, type %#x.\n", internal, format_gl->format, format_gl->type);
2072
2073 if (wined3d_texture_use_immutable_storage(&texture_gl->t, gl_info))
2075 else
2076 wined3d_texture_gl_allocate_mutable_storage(texture_gl, internal, format_gl, gl_info);
2077 texture_gl->t.flags |= alloc_flag;
2078}
ios_base &_STLP_CALL internal(ios_base &__s)
Definition: _ios_base.h:311
const struct wined3d_format * wined3d_resource_get_decompress_format(const struct wined3d_resource *resource)
Definition: resource.c:447
static BOOL wined3d_texture_use_immutable_storage(const struct wined3d_texture *texture, const struct wined3d_gl_info *gl_info)
Definition: texture.c:78
static void wined3d_texture_gl_allocate_immutable_storage(struct wined3d_texture_gl *texture_gl, GLenum gl_internal_format, const struct wined3d_gl_info *gl_info)
Definition: texture.c:1037
static void wined3d_texture_gl_allocate_mutable_storage(struct wined3d_texture_gl *texture_gl, GLenum gl_internal_format, const struct wined3d_format_gl *format, const struct wined3d_gl_info *gl_info)
Definition: texture.c:977
const char * debug_d3dformat(enum wined3d_format_id format_id)
Definition: utils.c:4605
const struct wined3d_format * wined3d_get_format(const struct wined3d_adapter *adapter, enum wined3d_format_id format_id, unsigned int bind_flags)
Definition: utils.c:4428
const struct wined3d_color_key_conversion * wined3d_format_get_color_key_conversion(const struct wined3d_texture *texture, BOOL need_alpha_ck)
Definition: utils.c:1293
enum wined3d_format_id dst_format
static GLuint wined3d_gl_get_internal_format(struct wined3d_resource *resource, const struct wined3d_format_gl *format_gl, bool srgb)
Definition: wined3d_gl.h:1161
#define WINED3D_TEXTURE_RGB_ALLOCATED
#define WINED3D_FORMAT_CAP_DECOMPRESS
#define WINED3D_TEXTURE_SRGB_ALLOCATED
#define WINED3D_TEXTURE_CONVERTED

Referenced by create_texture_view(), and wined3d_texture_gl_prepare_location().

◆ wined3d_texture_gl_set_compatible_renderbuffer()

void wined3d_texture_gl_set_compatible_renderbuffer ( struct wined3d_texture_gl *  texture_gl,
struct wined3d_context_gl *  context_gl,
unsigned int  level,
const struct wined3d_rendertarget_info *  rt 
)

Definition at line 1788 of file texture.c.

1790{
1791 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1793 unsigned int src_width, src_height;
1794 unsigned int width, height;
1795 GLuint renderbuffer = 0;
1796
1797 if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
1798 return;
1799
1800 if (rt && rt->resource->format->id != WINED3DFMT_NULL)
1801 {
1802 struct wined3d_texture *rt_texture;
1803 unsigned int rt_level;
1804
1805 if (rt->resource->type == WINED3D_RTYPE_BUFFER)
1806 {
1807 FIXME("Unsupported resource type %s.\n", debug_d3dresourcetype(rt->resource->type));
1808 return;
1809 }
1810 rt_texture = wined3d_texture_from_resource(rt->resource);
1811 rt_level = rt->sub_resource_idx % rt_texture->level_count;
1812
1813 width = wined3d_texture_get_level_width(rt_texture, rt_level);
1814 height = wined3d_texture_get_level_height(rt_texture, rt_level);
1815 }
1816 else
1817 {
1820 }
1821
1822 src_width = wined3d_texture_get_level_width(&texture_gl->t, level);
1823 src_height = wined3d_texture_get_level_height(&texture_gl->t, level);
1824
1825 /* A depth stencil smaller than the render target is not valid */
1826 if (width > src_width || height > src_height)
1827 return;
1828
1829 /* Remove any renderbuffer set if the sizes match */
1830 if (width == src_width && height == src_height)
1831 {
1832 texture_gl->current_renderbuffer = NULL;
1833 return;
1834 }
1835
1836 /* Look if we've already got a renderbuffer of the correct dimensions */
1838 {
1839 if (entry->width == width && entry->height == height)
1840 {
1841 renderbuffer = entry->id;
1842 texture_gl->current_renderbuffer = entry;
1843 break;
1844 }
1845 }
1846
1847 if (!renderbuffer)
1848 {
1849 const struct wined3d_format_gl *format_gl;
1850
1851 format_gl = wined3d_format_gl(texture_gl->t.resource.format);
1852 gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer);
1853 gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
1854 gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, format_gl->internal, width, height);
1855
1856 entry = malloc(sizeof(*entry));
1857 entry->width = width;
1858 entry->height = height;
1859 entry->id = renderbuffer;
1860 list_add_head(&texture_gl->renderbuffers, &entry->entry);
1861
1862 texture_gl->current_renderbuffer = entry;
1863 }
1864
1865 checkGLcall("set compatible renderbuffer");
1866}
GLuint renderbuffer
Definition: glext.h:6989
#define GL_RENDERBUFFER
Definition: glext.h:1733
Definition: wined3d_gl.h:933
const struct wined3d_renderbuffer_entry * current_renderbuffer
Definition: wined3d_gl.h:951
unsigned int level_count

Referenced by wined3d_context_gl_find_fbo_entry().

◆ wined3d_unordered_access_view_gl()

◆ wined3d_unordered_access_view_gl_clear()

void wined3d_unordered_access_view_gl_clear ( struct wined3d_unordered_access_view_gl *  view_gl,
const struct wined3d_uvec4 *  clear_value,
struct wined3d_context_gl *  context_gl,
bool  fp 
)

Definition at line 1570 of file view.c.

1572{
1573 const struct wined3d_gl_info *gl_info = context_gl->gl_info;
1574 const struct wined3d_format_gl *format_gl;
1575 struct wined3d_resource *resource;
1576 struct wined3d_buffer *buffer;
1577 struct wined3d_bo_gl *bo_gl;
1578 unsigned int offset, size;
1579
1580 resource = view_gl->v.resource;
1581 if (resource->type != WINED3D_RTYPE_BUFFER)
1582 {
1583 unsigned int layer_count, level_count, base_level, base_layer;
1584 unsigned int sub_resource_idx, width, height, depth, i, j;
1585 struct wined3d_texture_gl *texture_gl;
1586 const void *data = clear_value;
1587 GLenum gl_format, gl_type;
1589
1590 if (!gl_info->supported[ARB_CLEAR_TEXTURE])
1591 {
1592 FIXME("OpenGL implementation does not support ARB_clear_texture.\n");
1593 return;
1594 }
1595
1596 format_gl = wined3d_format_gl(resource->format);
1598 level_count = view_gl->v.desc.u.texture.level_count;
1599 base_level = view_gl->v.desc.u.texture.level_idx;
1600
1602 {
1603 layer_count = 1;
1604 base_layer = 0;
1605 }
1606 else
1607 {
1608 layer_count = view_gl->v.desc.u.texture.layer_count;
1609 base_layer = view_gl->v.desc.u.texture.layer_idx;
1610 }
1611
1612 if (format_gl->f.byte_count <= 4 && !fp)
1613 {
1614 gl_format = format_gl->format;
1615 gl_type = format_gl->type;
1616 packed = wined3d_format_pack(&format_gl->f, clear_value);
1617 data = &packed;
1618 }
1619 else if (resource->format_attrs & WINED3D_FORMAT_ATTR_INTEGER)
1620 {
1621 gl_format = GL_RGBA_INTEGER;
1622 gl_type = GL_UNSIGNED_INT;
1623 }
1624 else
1625 {
1626 gl_format = GL_RGBA;
1627 gl_type = GL_FLOAT;
1628 }
1629
1630 for (i = 0; i < layer_count; ++i)
1631 {
1632 for (j = 0; j < level_count; ++j)
1633 {
1634 sub_resource_idx = (base_layer + i) * texture_gl->t.level_count + base_level + j;
1635 wined3d_texture_prepare_location(&texture_gl->t, sub_resource_idx,
1636 &context_gl->c, WINED3D_LOCATION_TEXTURE_RGB);
1637
1638 width = wined3d_texture_get_level_width(&texture_gl->t, base_level + j);
1639 height = wined3d_texture_get_level_height(&texture_gl->t, base_level + j);
1640 depth = wined3d_texture_get_level_depth(&texture_gl->t, base_level + j);
1641
1642 switch (texture_gl->target)
1643 {
1645 GL_EXTCALL(glClearTexSubImage(texture_gl->texture_rgb.name, base_level + j,
1646 0, base_layer + i, 0, width, 1, 1, gl_format, gl_type, data));
1647 break;
1648
1653 GL_EXTCALL(glClearTexSubImage(texture_gl->texture_rgb.name, base_level + j,
1654 0, 0, base_layer + i, width, height, 1, gl_format, gl_type, data));
1655 break;
1656
1657 default:
1658 GL_EXTCALL(glClearTexSubImage(texture_gl->texture_rgb.name, base_level + j,
1659 0, 0, 0, width, height, depth, gl_format, gl_type, data));
1660 break;
1661 }
1662
1663 wined3d_texture_validate_location(&texture_gl->t, sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
1664 wined3d_texture_invalidate_location(&texture_gl->t, sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
1665 }
1666 }
1667
1668 return;
1669 }
1670
1671 if (!gl_info->supported[ARB_CLEAR_BUFFER_OBJECT])
1672 {
1673 FIXME("OpenGL implementation does not support ARB_clear_buffer_object.\n");
1674 return;
1675 }
1676
1677 format_gl = wined3d_format_gl(view_gl->v.format);
1678 if (format_gl->f.id != WINED3DFMT_R32_UINT && format_gl->f.id != WINED3DFMT_R32_SINT
1679 && format_gl->f.id != WINED3DFMT_R32G32B32A32_UINT
1680 && format_gl->f.id != WINED3DFMT_R32G32B32A32_SINT)
1681 {
1682 FIXME("Not implemented for format %s.\n", debug_d3dformat(format_gl->f.id));
1683 return;
1684 }
1685
1686 if (fp)
1687 {
1688 FIXME("Floating-point buffer clears not implemented.\n");
1689 return;
1690 }
1691
1693 get_buffer_view_range(buffer, &view_gl->v.desc, &format_gl->f, &offset, &size);
1694
1695 if (!offset && size == buffer->resource.size)
1696 {
1698 }
1699 else
1700 {
1703 }
1705
1706 bo_gl = wined3d_bo_gl(buffer->buffer_object);
1707 wined3d_context_gl_bind_bo(context_gl, bo_gl->binding, bo_gl->id);
1708 GL_EXTCALL(glClearBufferSubData(bo_gl->binding, format_gl->internal,
1709 bo_gl->b.buffer_offset + offset, size, format_gl->format, format_gl->type, clear_value));
1710 wined3d_context_gl_reference_bo(context_gl, bo_gl);
1711 checkGLcall("clear unordered access view");
1712}
BOOL wined3d_buffer_prepare_location(struct wined3d_buffer *buffer, struct wined3d_context *context, unsigned int location)
Definition: buffer.c:257
BOOL wined3d_buffer_load_location(struct wined3d_buffer *buffer, struct wined3d_context *context, uint32_t location)
Definition: buffer.c:269
void wined3d_buffer_acquire_bo_for_write(struct wined3d_buffer *buffer, struct wined3d_context *context)
Definition: buffer.c:750
BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_context *context, unsigned int location)
Definition: texture.c:2116
uint32_t wined3d_format_pack(const struct wined3d_format *format, const struct wined3d_uvec4 *value)
Definition: utils.c:5778
static void get_buffer_view_range(const struct wined3d_buffer *buffer, const struct wined3d_view_desc *desc, const struct wined3d_format *view_format, unsigned int *offset, unsigned int *size)
Definition: view.c:291
void wined3d_unordered_access_view_invalidate_location(struct wined3d_unordered_access_view *view, uint32_t location)
Definition: view.c:1564
GLint GLint GLsizei GLsizei GLsizei depth
Definition: gl.h:1546
#define GL_UNSIGNED_INT
Definition: gl.h:182
#define GL_RGBA
Definition: gl.h:503
#define GL_RGBA_INTEGER
Definition: glext.h:575
GLuint GLenum GLsizei GLsizei GLint GLint GLboolean packed
Definition: glext.h:9271
#define resource
Definition: kernel32.h:9
struct wined3d_unordered_access_view v
Definition: wined3d_gl.h:1104
@ WINED3DFMT_R32_SINT
Definition: wined3d.h:200
@ WINED3DFMT_R32_UINT
Definition: wined3d.h:199
@ WINED3DFMT_R32G32B32A32_UINT
Definition: wined3d.h:158
@ WINED3DFMT_R32G32B32A32_SINT
Definition: wined3d.h:159
#define WINED3D_FORMAT_ATTR_INTEGER
#define WINED3D_LOCATION_BUFFER
static unsigned int wined3d_texture_get_level_depth(const struct wined3d_texture *texture, unsigned int level)

Referenced by adapter_gl_clear_uav().

◆ wined3d_unordered_access_view_gl_init()

HRESULT wined3d_unordered_access_view_gl_init ( struct wined3d_unordered_access_view_gl *  view_gl,
const struct wined3d_view_desc *  desc,
struct wined3d_resource *  resource,
void *  parent,
const struct wined3d_parent_ops *  parent_ops 
)

Definition at line 1833 of file view.c.

1836{
1837 HRESULT hr;
1838
1839 TRACE("view_gl %p, desc %s, resource %p, parent %p, parent_ops %p.\n",
1840 view_gl, wined3d_debug_view_desc(desc, resource), resource, parent, parent_ops);
1841
1842 if (FAILED(hr = wined3d_unordered_access_view_init(&view_gl->v, desc, resource, parent, parent_ops)))
1843 return hr;
1844
1845 list_init(&view_gl->bo_user.entry);
1847
1848 return hr;
1849}
static HRESULT wined3d_unordered_access_view_init(struct wined3d_unordered_access_view *view, const struct wined3d_view_desc *desc, struct wined3d_resource *resource, void *parent, const struct wined3d_parent_ops *parent_ops)
Definition: view.c:1814
static void wined3d_unordered_access_view_gl_cs_init(void *object)
Definition: view.c:1764
struct wined3d_bo_user bo_user
Definition: wined3d_gl.h:1105

Referenced by adapter_gl_create_unordered_access_view().

◆ wined3d_unordered_access_view_gl_update()

void wined3d_unordered_access_view_gl_update ( struct wined3d_unordered_access_view_gl *  uav_gl,
struct wined3d_context_gl *  context_gl 
)

Definition at line 1753 of file view.c.

1755{
1756 struct wined3d_buffer *buffer = buffer_from_resource(uav_gl->v.resource);
1757
1758 assert(!uav_gl->bo_user.valid);
1759 create_buffer_view(&uav_gl->gl_view, &context_gl->c, &uav_gl->v.desc, buffer, uav_gl->v.format);
1760 uav_gl->bo_user.valid = true;
1761 list_add_head(&buffer->buffer_object->users, &uav_gl->bo_user.entry);
1762}
struct wined3d_gl_view gl_view
Definition: wined3d_gl.h:1106

Referenced by context_gl_load_unordered_access_resources().

Variable Documentation

◆ magLookup

const GLenum magLookup[WINED3D_TEXF_LINEAR+1]
extern

Definition at line 71 of file directx.c.

Referenced by wined3d_gl_mag_filter().

◆ minMipLookup

const struct min_lookup minMipLookup[WINED3D_TEXF_LINEAR+1]
extern

Definition at line 63 of file directx.c.

Referenced by wined3d_gl_min_mip_filter().