wined3d: Move the OpenGL texture format to struct wined3d_format_gl.

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Henri Verbeet 2018-09-22 02:56:09 +03:30 committed by Alexandre Julliard
parent 3ad933d5e6
commit 1606dd39e2
6 changed files with 349 additions and 322 deletions

View File

@ -3868,6 +3868,7 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_unordered_access_view *view;
const struct wined3d_format_gl *format_gl;
GLuint texture_name;
unsigned int i;
GLint level;
@ -3903,8 +3904,9 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
continue;
}
format_gl = wined3d_format_gl(view->format);
GL_EXTCALL(glBindImageTexture(i, texture_name, level, GL_TRUE, 0, GL_READ_WRITE,
view->format->glInternal));
format_gl->internal));
if (view->counter_bo)
GL_EXTCALL(glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, i, view->counter_bo));

View File

@ -348,22 +348,24 @@ static BOOL fbo_blitter_supported(enum wined3d_blit_op blit_op, const struct win
static void texture2d_download_data(struct wined3d_texture *texture, unsigned int sub_resource_idx,
const struct wined3d_context *context, DWORD dst_location)
{
const struct wined3d_format *format = texture->resource.format;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_texture_sub_resource *sub_resource;
unsigned int dst_row_pitch, dst_slice_pitch;
unsigned int src_row_pitch, src_slice_pitch;
const struct wined3d_format_gl *format_gl;
struct wined3d_bo_address data;
BYTE *temporary_mem = NULL;
unsigned int level;
GLenum target;
void *mem;
format_gl = wined3d_format_gl(texture->resource.format);
/* Only support read back of converted P8 textures. */
if (texture->flags & WINED3D_TEXTURE_CONVERTED && format->id != WINED3DFMT_P8_UINT && !format->download)
if (texture->flags & WINED3D_TEXTURE_CONVERTED && format_gl->f.id != WINED3DFMT_P8_UINT && !format_gl->f.download)
{
ERR("Trying to read back converted texture %p, %u with format %s.\n",
texture, sub_resource_idx, debug_d3dformat(format->id));
texture, sub_resource_idx, debug_d3dformat(format_gl->f.id));
return;
}
@ -373,7 +375,7 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
if (target == GL_TEXTURE_2D_ARRAY)
{
if (format->download)
if (format_gl->f.download)
{
FIXME("Reading back converted array texture %p is not supported.\n", texture);
return;
@ -396,14 +398,14 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
{
if (format->download)
if (format_gl->f.download)
{
FIXME("Reading back converted texture %p with NP2 emulation is not supported.\n", texture);
return;
}
wined3d_texture_get_pitch(texture, level, &dst_row_pitch, &dst_slice_pitch);
wined3d_format_calculate_pitch(format, texture->resource.device->surface_alignment,
wined3d_format_calculate_pitch(&format_gl->f, texture->resource.device->surface_alignment,
wined3d_texture_get_level_pow2_width(texture, level),
wined3d_texture_get_level_pow2_height(texture, level),
&src_row_pitch, &src_slice_pitch);
@ -419,7 +421,7 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
ERR("Unexpected compressed format for NP2 emulated texture.\n");
}
if (format->download)
if (format_gl->f.download)
{
struct wined3d_format f;
@ -427,10 +429,10 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
ERR("Converted texture %p uses PBO unexpectedly.\n", texture);
WARN_(d3d_perf)("Downloading converted texture %p, %u with format %s.\n",
texture, sub_resource_idx, debug_d3dformat(format->id));
texture, sub_resource_idx, debug_d3dformat(format_gl->f.id));
f = *format;
f.byte_count = format->conv_byte_count;
f = format_gl->f;
f.byte_count = format_gl->f.conv_byte_count;
wined3d_texture_get_pitch(texture, level, &dst_row_pitch, &dst_slice_pitch);
wined3d_format_calculate_pitch(&f, texture->resource.device->surface_alignment,
wined3d_texture_get_level_width(texture, level),
@ -462,7 +464,7 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
if (texture->resource.format_flags & WINED3DFMT_FLAG_COMPRESSED)
{
TRACE("Downloading compressed texture %p, %u, level %u, format %#x, type %#x, data %p.\n",
texture, sub_resource_idx, level, format->glFormat, format->glType, mem);
texture, sub_resource_idx, level, format_gl->format, format_gl->type, mem);
GL_EXTCALL(glGetCompressedTexImage(target, level, mem));
checkGLcall("glGetCompressedTexImage");
@ -470,15 +472,15 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
else
{
TRACE("Downloading texture %p, %u, level %u, format %#x, type %#x, data %p.\n",
texture, sub_resource_idx, level, format->glFormat, format->glType, mem);
texture, sub_resource_idx, level, format_gl->format, format_gl->type, mem);
gl_info->gl_ops.gl.p_glGetTexImage(target, level, format->glFormat, format->glType, mem);
gl_info->gl_ops.gl.p_glGetTexImage(target, level, format_gl->format, format_gl->type, mem);
checkGLcall("glGetTexImage");
}
if (format->download)
if (format_gl->f.download)
{
format->download(mem, data.addr, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch,
format_gl->f.download(mem, data.addr, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch,
wined3d_texture_get_level_width(texture, level),
wined3d_texture_get_level_height(texture, level), 1);
}
@ -931,7 +933,9 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
static void texture2d_read_from_framebuffer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, DWORD src_location, DWORD dst_location)
{
struct wined3d_device *device = texture->resource.device;
struct wined3d_resource *resource = &texture->resource;
struct wined3d_device *device = resource->device;
const struct wined3d_format_gl *format_gl;
struct wined3d_texture *restore_texture;
const struct wined3d_gl_info *gl_info;
unsigned int row_pitch, slice_pitch;
@ -953,10 +957,10 @@ static void texture2d_read_from_framebuffer(struct wined3d_texture *texture, uns
restore_texture = NULL;
gl_info = context->gl_info;
if (src_location != texture->resource.draw_binding)
if (src_location != resource->draw_binding)
{
context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER,
&texture->resource, sub_resource_idx, NULL, 0, src_location);
resource, sub_resource_idx, NULL, 0, src_location);
context_check_fbo_status(context, GL_READ_FRAMEBUFFER);
context_invalidate_state(context, STATE_FRAMEBUFFER);
}
@ -969,7 +973,7 @@ static void texture2d_read_from_framebuffer(struct wined3d_texture *texture, uns
* There is no need to keep track of the current read buffer or reset it,
* every part of the code that reads sets the read buffer as desired.
*/
if (src_location != WINED3D_LOCATION_DRAWABLE || wined3d_resource_is_offscreen(&texture->resource))
if (src_location != WINED3D_LOCATION_DRAWABLE || wined3d_resource_is_offscreen(resource))
{
/* Mapping the primary render target which is not on a swapchain.
* Read from the back buffer. */
@ -995,16 +999,16 @@ static void texture2d_read_from_framebuffer(struct wined3d_texture *texture, uns
level = sub_resource_idx % texture->level_count;
wined3d_texture_get_pitch(texture, level, &row_pitch, &slice_pitch);
format_gl = wined3d_format_gl(resource->format);
/* Setup pixel store pack state -- to glReadPixels into the correct place */
gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH, row_pitch / texture->resource.format->byte_count);
gl_info->gl_ops.gl.p_glPixelStorei(GL_PACK_ROW_LENGTH, row_pitch / format_gl->f.byte_count);
checkGLcall("glPixelStorei");
width = wined3d_texture_get_level_width(texture, level);
height = wined3d_texture_get_level_height(texture, level);
gl_info->gl_ops.gl.p_glReadPixels(0, 0, width, height,
texture->resource.format->glFormat,
texture->resource.format->glType, data.addr);
format_gl->format, format_gl->type, data.addr);
checkGLcall("glReadPixels");
/* Reset previous pixel store pack state */

View File

@ -561,7 +561,7 @@ static unsigned int wined3d_texture_get_gl_sample_count(const struct wined3d_tex
/* Context activation is done by the caller. */
/* The caller is responsible for binding the correct texture. */
static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *texture,
GLenum gl_internal_format, const struct wined3d_format *format,
GLenum gl_internal_format, const struct wined3d_format_gl *format,
const struct wined3d_gl_info *gl_info)
{
unsigned int level, level_count, layer, layer_count;
@ -584,8 +584,8 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
height = wined3d_texture_get_level_pow2_height(texture, level);
if (texture->resource.format_flags & WINED3DFMT_FLAG_HEIGHT_SCALE)
{
height *= format->height_scale.numerator;
height /= format->height_scale.denominator;
height *= format->f.height_scale.numerator;
height /= format->f.height_scale.denominator;
}
TRACE("texture %p, layer %u, level %u, target %#x, width %u, height %u.\n",
@ -596,19 +596,19 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
depth = wined3d_texture_get_level_depth(texture, level);
GL_EXTCALL(glTexImage3D(target, level, gl_internal_format, width, height,
target == GL_TEXTURE_2D_ARRAY ? texture->layer_count : depth, 0,
format->glFormat, format->glType, NULL));
format->format, format->type, NULL));
checkGLcall("glTexImage3D");
}
else if (target == GL_TEXTURE_1D)
{
gl_info->gl_ops.gl.p_glTexImage1D(target, level, gl_internal_format,
width, 0, format->glFormat, format->glType, NULL);
width, 0, format->format, format->type, NULL);
}
else
{
gl_info->gl_ops.gl.p_glTexImage2D(target, level, gl_internal_format, width,
target == GL_TEXTURE_1D_ARRAY ? texture->layer_count : height, 0,
format->glFormat, format->glType, NULL);
format->format, format->type, NULL);
checkGLcall("glTexImage2D");
}
}
@ -1513,10 +1513,12 @@ void wined3d_texture_set_compatible_renderbuffer(struct wined3d_texture *texture
if (!renderbuffer)
{
const struct wined3d_format_gl *format_gl;
format_gl = wined3d_format_gl(texture->resource.format);
gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER,
texture->resource.format->glInternal, width, height);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, format_gl->internal, width, height);
entry = heap_alloc(sizeof(*entry));
entry->width = width;
@ -1712,11 +1714,13 @@ static void wined3d_texture_force_reload(struct wined3d_texture *texture)
void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct wined3d_context *context, BOOL srgb)
{
DWORD alloc_flag = srgb ? WINED3D_TEXTURE_SRGB_ALLOCATED : WINED3D_TEXTURE_RGB_ALLOCATED;
const struct wined3d_device *device = texture->resource.device;
const struct wined3d_format *format = texture->resource.format;
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_resource *resource = &texture->resource;
const struct wined3d_device *device = resource->device;
const struct wined3d_format *format = resource->format;
const struct wined3d_color_key_conversion *conversion;
const struct wined3d_format_gl *format_gl;
GLenum internal;
TRACE("texture %p, context %p, format %s.\n", texture, context, debug_d3dformat(format->id));
@ -1734,11 +1738,11 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
if (texture->flags & alloc_flag)
return;
if (texture->resource.format_flags & WINED3DFMT_FLAG_DECOMPRESS)
if (resource->format_flags & WINED3DFMT_FLAG_DECOMPRESS)
{
TRACE("WINED3DFMT_FLAG_DECOMPRESS set.\n");
texture->flags |= WINED3D_TEXTURE_CONVERTED;
format = wined3d_resource_get_decompress_format(&texture->resource);
format = wined3d_resource_get_decompress_format(resource);
}
else if (format->conv_byte_count)
{
@ -1747,37 +1751,38 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
else if ((conversion = wined3d_format_get_color_key_conversion(texture, TRUE)))
{
texture->flags |= WINED3D_TEXTURE_CONVERTED;
format = wined3d_get_format(device->adapter, conversion->dst_format, texture->resource.usage);
format = wined3d_get_format(device->adapter, conversion->dst_format, resource->usage);
TRACE("Using format %s for color key conversion.\n", debug_d3dformat(format->id));
}
format_gl = wined3d_format_gl(format);
wined3d_texture_bind_and_dirtify(texture, context, srgb);
if (srgb)
internal = format->glGammaInternal;
else if (texture->resource.usage & WINED3DUSAGE_RENDERTARGET
&& wined3d_resource_is_offscreen(&texture->resource))
internal = format->rtInternal;
internal = format_gl->srgb_internal;
else if (resource->usage & WINED3DUSAGE_RENDERTARGET && wined3d_resource_is_offscreen(resource))
internal = format_gl->rt_internal;
else
internal = format->glInternal;
internal = format_gl->internal;
if (!internal)
FIXME("No GL internal format for format %s.\n", debug_d3dformat(format->id));
TRACE("internal %#x, format %#x, type %#x.\n", internal, format->glFormat, format->glType);
TRACE("internal %#x, format %#x, type %#x.\n", internal, format_gl->format, format_gl->type);
if (wined3d_texture_use_immutable_storage(texture, gl_info))
wined3d_texture_allocate_gl_immutable_storage(texture, internal, gl_info);
else
wined3d_texture_allocate_gl_mutable_storage(texture, internal, format, gl_info);
wined3d_texture_allocate_gl_mutable_storage(texture, internal, format_gl, gl_info);
texture->flags |= alloc_flag;
}
static void wined3d_texture_prepare_rb(struct wined3d_texture *texture,
const struct wined3d_gl_info *gl_info, BOOL multisample)
{
const struct wined3d_format *format = texture->resource.format;
const struct wined3d_format_gl *format_gl;
format_gl = wined3d_format_gl(texture->resource.format);
if (multisample)
{
DWORD samples;
@ -1790,7 +1795,7 @@ static void wined3d_texture_prepare_rb(struct wined3d_texture *texture,
gl_info->fbo_ops.glGenRenderbuffers(1, &texture->rb_multisample);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, texture->rb_multisample);
gl_info->fbo_ops.glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples,
format->glInternal, texture->resource.width, texture->resource.height);
format_gl->internal, texture->resource.width, texture->resource.height);
checkGLcall("glRenderbufferStorageMultisample()");
TRACE("Created multisample rb %u.\n", texture->rb_multisample);
}
@ -1801,7 +1806,7 @@ static void wined3d_texture_prepare_rb(struct wined3d_texture *texture,
gl_info->fbo_ops.glGenRenderbuffers(1, &texture->rb_resolved);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, texture->rb_resolved);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, format->glInternal,
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, format_gl->internal,
texture->resource.width, texture->resource.height);
checkGLcall("glRenderbufferStorage()");
TRACE("Created resolved rb %u.\n", texture->rb_resolved);
@ -1906,9 +1911,10 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
unsigned int update_w = src_box->right - src_box->left;
unsigned int update_h = src_box->bottom - src_box->top;
unsigned int update_d = src_box->back - src_box->front;
const struct wined3d_format_gl *format_gl;
struct wined3d_bo_address bo;
void *converted_mem = NULL;
struct wined3d_format f;
struct wined3d_format_gl f;
unsigned int level;
BOOL decompress;
GLenum target;
@ -1978,9 +1984,9 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
if (texture->resource.format_flags & WINED3DFMT_FLAG_BLOCKS)
ERR("Converting a block-based format.\n");
f = *format;
f.byte_count = format->conv_byte_count;
format = &f;
f = *wined3d_format_gl(format);
f.f.byte_count = format->conv_byte_count;
format = &f.f;
}
wined3d_format_calculate_pitch(format, 1, update_w, update_h, &dst_row_pitch, &dst_slice_pitch);
@ -2015,6 +2021,7 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
checkGLcall("glBindBuffer");
}
format_gl = wined3d_format_gl(format);
if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
{
unsigned int dst_row_pitch, dst_slice_pitch;
@ -2022,12 +2029,12 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
GLenum internal;
if (srgb)
internal = format->glGammaInternal;
internal = format_gl->srgb_internal;
else if (texture->resource.usage & WINED3DUSAGE_RENDERTARGET
&& wined3d_resource_is_offscreen(&texture->resource))
internal = format->rtInternal;
internal = format_gl->rt_internal;
else
internal = format->glInternal;
internal = format_gl->internal;
wined3d_format_calculate_pitch(format, 1, update_w, update_h, &dst_row_pitch, &dst_slice_pitch);
@ -2088,23 +2095,23 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
TRACE("Uploading data, target %#x, level %u, x %u, y %u, z %u, "
"w %u, h %u, d %u, format %#x, type %#x, addr %p.\n",
target, level, dst_x, dst_y, dst_z, update_w, update_h,
update_d, format->glFormat, format->glType, bo.addr);
update_d, format_gl->format, format_gl->type, bo.addr);
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, src_row_pitch / format->byte_count);
if (target == GL_TEXTURE_2D_ARRAY || target == GL_TEXTURE_3D)
{
GL_EXTCALL(glTexSubImage3D(target, level, dst_x, dst_y, dst_z,
update_w, update_h, update_d, format->glFormat, format->glType, bo.addr));
update_w, update_h, update_d, format_gl->format, format_gl->type, bo.addr));
}
else if (target == GL_TEXTURE_1D)
{
gl_info->gl_ops.gl.p_glTexSubImage1D(target, level, dst_x,
update_w, format->glFormat, format->glType, bo.addr);
update_w, format_gl->format, format_gl->type, bo.addr);
}
else
{
gl_info->gl_ops.gl.p_glTexSubImage2D(target, level, dst_x, dst_y,
update_w, update_h, format->glFormat, format->glType, bo.addr);
update_w, update_h, format_gl->format, format_gl->type, bo.addr);
}
gl_info->gl_ops.gl.p_glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
checkGLcall("Upload texture data");
@ -2437,13 +2444,14 @@ static const struct wined3d_resource_ops texture_resource_ops =
static void texture1d_download_data(struct wined3d_texture *texture, unsigned int sub_resource_idx,
const struct wined3d_context *context, const struct wined3d_bo_address *data)
{
const struct wined3d_format *format = texture->resource.format;
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_format_gl *format_gl;
if (format->conv_byte_count)
format_gl = wined3d_format_gl(texture->resource.format);
if (format_gl->f.conv_byte_count)
{
FIXME("Attempting to download a converted texture, format %s.\n",
debug_d3dformat(format->id));
debug_d3dformat(format_gl->f.id));
return;
}
@ -2454,7 +2462,7 @@ static void texture1d_download_data(struct wined3d_texture *texture, unsigned in
}
gl_info->gl_ops.gl.p_glGetTexImage(texture->target, sub_resource_idx,
format->glFormat, format->glType, data->addr);
format_gl->format, format_gl->type, data->addr);
checkGLcall("glGetTexImage");
if (data->buffer_object)
@ -2909,13 +2917,14 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
static void texture3d_download_data(struct wined3d_texture *texture, unsigned int sub_resource_idx,
const struct wined3d_context *context, const struct wined3d_bo_address *data)
{
const struct wined3d_format *format = texture->resource.format;
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_format_gl *format_gl;
if (format->conv_byte_count)
format_gl = wined3d_format_gl(texture->resource.format);
if (format_gl->f.conv_byte_count)
{
FIXME("Attempting to download a converted volume, format %s.\n",
debug_d3dformat(format->id));
debug_d3dformat(format_gl->f.id));
return;
}
@ -2926,7 +2935,7 @@ static void texture3d_download_data(struct wined3d_texture *texture, unsigned in
}
gl_info->gl_ops.gl.p_glGetTexImage(GL_TEXTURE_3D, sub_resource_idx,
format->glFormat, format->glType, data->addr);
format_gl->format, format_gl->type, data->addr);
checkGLcall("glGetTexImage");
if (data->buffer_object)

View File

@ -1935,6 +1935,11 @@ static struct wined3d_format *get_format_by_idx(const struct wined3d_adapter *ad
return (struct wined3d_format *)((BYTE *)adapter->formats + fmt_idx * adapter->format_size);
}
static struct wined3d_format_gl *get_format_gl_by_idx(const struct wined3d_adapter *adapter, int fmt_idx)
{
return wined3d_format_gl_mutable(get_format_by_idx(adapter, fmt_idx));
}
static struct wined3d_format *get_format_internal(const struct wined3d_adapter *adapter,
enum wined3d_format_id format_id)
{
@ -2431,7 +2436,7 @@ static void draw_test_quad(struct wined3d_caps_gl_ctx *ctx, const struct wined3d
}
/* Context activation is done by the caller. */
static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_format *format)
static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_format_gl *format)
{
/* Check if the default internal format is supported as a frame buffer
* target, otherwise fall back to the render target internal.
@ -2440,24 +2445,24 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
static const struct wined3d_color black = {0.0f, 0.0f, 0.0f, 1.0f};
static const struct wined3d_color half_transparent_red = {1.0f, 0.0f, 0.0f, 0.5f};
const struct wined3d_gl_info *gl_info = ctx->gl_info;
GLenum status, rt_internal = format->rtInternal;
GLenum status, rt_internal = format->rt_internal;
GLuint object, color_rb;
enum wined3d_gl_resource_type type;
BOOL fallback_fmt_used = FALSE, regular_fmt_used = FALSE;
gl_info->gl_ops.gl.p_glDisable(GL_BLEND);
for (type = 0; type < ARRAY_SIZE(format->flags); ++type)
for (type = 0; type < ARRAY_SIZE(format->f.flags); ++type)
{
const char *type_string = "color";
if (type == WINED3D_GL_RES_TYPE_BUFFER)
continue;
create_and_bind_fbo_attachment(gl_info, format->flags[type], type, &object, format->glInternal,
format->glFormat, format->glType);
create_and_bind_fbo_attachment(gl_info, format->f.flags[type], type,
&object, format->internal, format->format, format->type);
if (format->flags[type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
if (format->f.flags[type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
{
gl_info->fbo_ops.glGenRenderbuffers(1, &color_rb);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, color_rb);
@ -2478,39 +2483,39 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
if (status == GL_FRAMEBUFFER_COMPLETE)
{
TRACE("Format %s is supported as FBO %s attachment, type %u.\n",
debug_d3dformat(format->id), type_string, type);
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
format->rtInternal = format->glInternal;
debug_d3dformat(format->f.id), type_string, type);
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
format->rt_internal = format->internal;
regular_fmt_used = TRUE;
}
else
{
if (!rt_internal)
{
if (format->flags[type] & WINED3DFMT_FLAG_RENDERTARGET)
if (format->f.flags[type] & WINED3DFMT_FLAG_RENDERTARGET)
{
WARN("Format %s with rendertarget flag is not supported as FBO color attachment (type %u),"
" and no fallback specified.\n", debug_d3dformat(format->id), type);
format->flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
" and no fallback specified.\n", debug_d3dformat(format->f.id), type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
}
else
{
TRACE("Format %s is not supported as FBO %s attachment, type %u.\n",
debug_d3dformat(format->id), type_string, type);
debug_d3dformat(format->f.id), type_string, type);
}
format->rtInternal = format->glInternal;
format->rt_internal = format->internal;
}
else
{
TRACE("Format %s is not supported as FBO %s attachment (type %u),"
" trying rtInternal format as fallback.\n",
debug_d3dformat(format->id), type_string, type);
debug_d3dformat(format->f.id), type_string, type);
while (gl_info->gl_ops.gl.p_glGetError());
delete_fbo_attachment(gl_info, type, object);
create_and_bind_fbo_attachment(gl_info, format->flags[type], type, &object, format->rtInternal,
format->glFormat, format->glType);
create_and_bind_fbo_attachment(gl_info, format->f.flags[type], type,
&object, format->rt_internal, format->format, format->type);
status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
checkGLcall("Framebuffer format check");
@ -2518,25 +2523,25 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
if (status == GL_FRAMEBUFFER_COMPLETE)
{
TRACE("Format %s rtInternal format is supported as FBO %s attachment, type %u.\n",
debug_d3dformat(format->id), type_string, type);
debug_d3dformat(format->f.id), type_string, type);
fallback_fmt_used = TRUE;
}
else
{
WARN("Format %s rtInternal format is not supported as FBO %s attachment, type %u.\n",
debug_d3dformat(format->id), type_string, type);
format->flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
debug_d3dformat(format->f.id), type_string, type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
}
}
}
if (status == GL_FRAMEBUFFER_COMPLETE
&& ((format->flags[type] & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)
&& ((format->f.flags[type] & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)
|| !(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))
&& !(format->flags[type] & WINED3DFMT_FLAG_INTEGER)
&& format->id != WINED3DFMT_NULL && format->id != WINED3DFMT_P8_UINT
&& format->glFormat != GL_LUMINANCE && format->glFormat != GL_LUMINANCE_ALPHA
&& (format->red_size || format->alpha_size))
&& !(format->f.flags[type] & WINED3DFMT_FLAG_INTEGER)
&& format->f.id != WINED3DFMT_NULL && format->f.id != WINED3DFMT_P8_UINT
&& format->format != GL_LUMINANCE && format->format != GL_LUMINANCE_ALPHA
&& (format->f.red_size || format->f.alpha_size))
{
DWORD readback[16 * 16 * 16], color, r_range, a_range;
BYTE r, a;
@ -2564,8 +2569,8 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
{
while (gl_info->gl_ops.gl.p_glGetError());
TRACE("Format %s doesn't support post-pixelshader blending, type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
debug_d3dformat(format->f.id), type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
else
{
@ -2628,25 +2633,25 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
a = color >> 24;
r = (color & 0x00ff0000u) >> 16;
r_range = format->red_size < 8 ? 1u << (8 - format->red_size) : 1;
a_range = format->alpha_size < 8 ? 1u << (8 - format->alpha_size) : 1;
if (format->red_size && (r < 0x7f - r_range || r > 0x7f + r_range))
r_range = format->f.red_size < 8 ? 1u << (8 - format->f.red_size) : 1;
a_range = format->f.alpha_size < 8 ? 1u << (8 - format->f.alpha_size) : 1;
if (format->f.red_size && (r < 0x7f - r_range || r > 0x7f + r_range))
match = FALSE;
else if (format->alpha_size > 1 && (a < 0xbf - a_range || a > 0xbf + a_range))
else if (format->f.alpha_size > 1 && (a < 0xbf - a_range || a > 0xbf + a_range))
match = FALSE;
if (!match)
{
TRACE("Format %s doesn't support post-pixelshader blending, type %u.\n",
debug_d3dformat(format->id), type);
debug_d3dformat(format->f.id), type);
TRACE("Color output: %#x\n", color);
format->flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
format->f.flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
else
{
TRACE("Format %s supports post-pixelshader blending, type %u.\n",
debug_d3dformat(format->id), type);
debug_d3dformat(format->f.id), type);
TRACE("Color output: %#x\n", color);
format->flags[type] |= WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
format->f.flags[type] |= WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
}
@ -2660,11 +2665,11 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
}
}
if (format->glInternal != format->glGammaInternal)
if (format->internal != format->srgb_internal)
{
delete_fbo_attachment(gl_info, type, object);
create_and_bind_fbo_attachment(gl_info, format->flags[type], type, &object, format->glGammaInternal,
format->glFormat, format->glType);
create_and_bind_fbo_attachment(gl_info, format->f.flags[type], type, &object, format->srgb_internal,
format->format, format->type);
status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
checkGLcall("Framebuffer format check");
@ -2672,22 +2677,22 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
if (status == GL_FRAMEBUFFER_COMPLETE)
{
TRACE("Format %s's sRGB format is FBO attachable, type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
debug_d3dformat(format->f.id), type);
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
format->glInternal = format->glGammaInternal;
format->internal = format->srgb_internal;
}
else
{
WARN("Format %s's sRGB format is not FBO attachable, type %u.\n",
debug_d3dformat(format->id), type);
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_WRITE);
debug_d3dformat(format->f.id), type);
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_WRITE);
}
}
else if (status == GL_FRAMEBUFFER_COMPLETE)
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
if (format->flags[type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
if (format->f.flags[type] & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
{
gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
gl_info->fbo_ops.glDeleteRenderbuffers(1, &color_rb);
@ -2700,30 +2705,30 @@ static void check_fbo_compat(struct wined3d_caps_gl_ctx *ctx, struct wined3d_for
if (fallback_fmt_used && regular_fmt_used)
{
FIXME("Format %s needs different render target formats for different resource types.\n",
debug_d3dformat(format->id));
format_clear_flag(format, WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_FBO_ATTACHABLE
debug_d3dformat(format->f.id));
format_clear_flag(&format->f, WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_FBO_ATTACHABLE
| WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING);
}
}
static void query_format_flag(struct wined3d_gl_info *gl_info, struct wined3d_format *format,
static void query_format_flag(struct wined3d_gl_info *gl_info, struct wined3d_format_gl *format,
GLint internal, GLenum pname, DWORD flag, const char *string)
{
GLint value;
enum wined3d_gl_resource_type type;
for (type = 0; type < ARRAY_SIZE(format->flags); ++type)
for (type = 0; type < ARRAY_SIZE(format->f.flags); ++type)
{
gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type), internal, pname, 1, &value);
if (value == GL_FULL_SUPPORT)
{
TRACE("Format %s supports %s, resource type %u.\n", debug_d3dformat(format->id), string, type);
format->flags[type] |= flag;
TRACE("Format %s supports %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type);
format->f.flags[type] |= flag;
}
else
{
TRACE("Format %s doesn't support %s, resource type %u.\n", debug_d3dformat(format->id), string, type);
format->flags[type] &= ~flag;
TRACE("Format %s doesn't support %s, resource type %u.\n", debug_d3dformat(format->f.id), string, type);
format->f.flags[type] &= ~flag;
}
}
}
@ -2740,56 +2745,56 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter,
{
for (i = 0; i < WINED3D_FORMAT_COUNT; ++i)
{
struct wined3d_format *format = get_format_by_idx(adapter, i);
struct wined3d_format_gl *format = get_format_gl_by_idx(adapter, i);
BOOL fallback_fmt_used = FALSE, regular_fmt_used = FALSE;
GLenum rt_internal = format->rtInternal;
GLenum rt_internal = format->rt_internal;
GLint value;
if (!format->glInternal)
if (!format->internal)
continue;
for (type = 0; type < ARRAY_SIZE(format->flags); ++type)
for (type = 0; type < ARRAY_SIZE(format->f.flags); ++type)
{
gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type),
format->glInternal, GL_FRAMEBUFFER_RENDERABLE, 1, &value);
format->internal, GL_FRAMEBUFFER_RENDERABLE, 1, &value);
if (value == GL_FULL_SUPPORT)
{
TRACE("Format %s is supported as FBO color attachment, resource type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
format->rtInternal = format->glInternal;
debug_d3dformat(format->f.id), type);
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE;
format->rt_internal = format->internal;
regular_fmt_used = TRUE;
gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type),
format->glInternal, GL_FRAMEBUFFER_BLEND, 1, &value);
format->internal, GL_FRAMEBUFFER_BLEND, 1, &value);
if (value == GL_FULL_SUPPORT)
{
TRACE("Format %s supports post-pixelshader blending, resource type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] |= WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
debug_d3dformat(format->f.id), type);
format->f.flags[type] |= WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
else
{
TRACE("Format %s doesn't support post-pixelshader blending, resource typed %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
debug_d3dformat(format->f.id), type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING;
}
}
else
{
if (!rt_internal)
{
if (format->flags[type] & WINED3DFMT_FLAG_RENDERTARGET)
if (format->f.flags[type] & WINED3DFMT_FLAG_RENDERTARGET)
{
WARN("Format %s with rendertarget flag is not supported as FBO color attachment"
" and no fallback specified, resource type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
debug_d3dformat(format->f.id), type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
}
else
TRACE("Format %s is not supported as FBO color attachment,"
" resource type %u.\n", debug_d3dformat(format->id), type);
format->rtInternal = format->glInternal;
" resource type %u.\n", debug_d3dformat(format->f.id), type);
format->rt_internal = format->internal;
}
else
{
@ -2798,46 +2803,46 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter,
if (value == GL_FULL_SUPPORT)
{
TRACE("Format %s rtInternal format is supported as FBO color attachment,"
" resource type %u.\n", debug_d3dformat(format->id), type);
" resource type %u.\n", debug_d3dformat(format->f.id), type);
fallback_fmt_used = TRUE;
}
else
{
WARN("Format %s rtInternal format is not supported as FBO color attachment,"
" resource type %u.\n", debug_d3dformat(format->id), type);
format->flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
" resource type %u.\n", debug_d3dformat(format->f.id), type);
format->f.flags[type] &= ~WINED3DFMT_FLAG_RENDERTARGET;
}
}
}
if (format->glInternal != format->glGammaInternal)
if (format->internal != format->srgb_internal)
{
gl_info->gl_ops.ext.p_glGetInternalformativ(wined3d_gl_type_to_enum(type),
format->glGammaInternal, GL_FRAMEBUFFER_RENDERABLE, 1, &value);
format->srgb_internal, GL_FRAMEBUFFER_RENDERABLE, 1, &value);
if (value == GL_FULL_SUPPORT)
{
TRACE("Format %s's sRGB format is FBO attachable, resource type %u.\n",
debug_d3dformat(format->id), type);
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
debug_d3dformat(format->f.id), type);
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
if (gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
format->glInternal = format->glGammaInternal;
format->internal = format->srgb_internal;
}
else
{
WARN("Format %s's sRGB format is not FBO attachable, resource type %u.\n",
debug_d3dformat(format->id), type);
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_WRITE);
debug_d3dformat(format->f.id), type);
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_WRITE);
}
}
else if (format->flags[type] & WINED3DFMT_FLAG_FBO_ATTACHABLE)
format->flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
else if (format->f.flags[type] & WINED3DFMT_FLAG_FBO_ATTACHABLE)
format->f.flags[type] |= WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB;
}
if (fallback_fmt_used && regular_fmt_used)
{
FIXME("Format %s needs different render target formats for different resource types.\n",
debug_d3dformat(format->id));
format_clear_flag(format, WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_FBO_ATTACHABLE
debug_d3dformat(format->f.id));
format_clear_flag(&format->f, WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_FBO_ATTACHABLE
| WINED3DFMT_FLAG_FBO_ATTACHABLE_SRGB | WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING);
}
}
@ -2854,25 +2859,26 @@ static void init_format_fbo_compat_info(const struct wined3d_adapter *adapter,
for (i = 0; i < WINED3D_FORMAT_COUNT; ++i)
{
struct wined3d_format *format = get_format_by_idx(adapter, i);
struct wined3d_format_gl *format = get_format_gl_by_idx(adapter, i);
if (!format->glInternal) continue;
if (!format->internal)
continue;
if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
if (format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_COMPRESSED)
{
TRACE("Skipping format %s because it's a compressed format.\n",
debug_d3dformat(format->id));
debug_d3dformat(format->f.id));
continue;
}
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(format->id));
TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(format->f.id));
check_fbo_compat(ctx, format);
}
else
{
format->rtInternal = format->glInternal;
format->rt_internal = format->internal;
}
}
@ -2995,9 +3001,9 @@ static void query_view_class(struct wined3d_format_gl *format)
{
GLenum internal_view_class, gamma_view_class, rt_view_class;
internal_view_class = lookup_gl_view_class(format->f.glInternal);
gamma_view_class = lookup_gl_view_class(format->f.glGammaInternal);
rt_view_class = lookup_gl_view_class(format->f.rtInternal);
internal_view_class = lookup_gl_view_class(format->internal);
gamma_view_class = lookup_gl_view_class(format->srgb_internal);
rt_view_class = lookup_gl_view_class(format->rt_internal);
if (internal_view_class == gamma_view_class || gamma_view_class == rt_view_class)
{
@ -3012,7 +3018,7 @@ static void query_view_class(struct wined3d_format_gl *format)
}
static void query_internal_format(struct wined3d_adapter *adapter,
struct wined3d_format *format, const struct wined3d_format_texture_info *texture_info,
struct wined3d_format_gl *format, const struct wined3d_format_texture_info *texture_info,
struct wined3d_gl_info *gl_info, BOOL srgb_write_supported, BOOL srgb_format)
{
GLint count, multisample_types[8];
@ -3021,105 +3027,106 @@ static void query_internal_format(struct wined3d_adapter *adapter,
if (gl_info->supported[ARB_INTERNALFORMAT_QUERY2])
{
query_format_flag(gl_info, format, format->glInternal, GL_VERTEX_TEXTURE,
query_format_flag(gl_info, format, format->internal, GL_VERTEX_TEXTURE,
WINED3DFMT_FLAG_VTF, "vertex texture usage");
query_format_flag(gl_info, format, format->glInternal, GL_FILTER,
query_format_flag(gl_info, format, format->internal, GL_FILTER,
WINED3DFMT_FLAG_FILTERING, "filtering");
if (srgb_format || format->glGammaInternal != format->glInternal)
if (srgb_format || format->srgb_internal != format->internal)
{
query_format_flag(gl_info, format, format->glGammaInternal, GL_SRGB_READ,
query_format_flag(gl_info, format, format->srgb_internal, GL_SRGB_READ,
WINED3DFMT_FLAG_SRGB_READ, "sRGB read");
if (srgb_write_supported)
query_format_flag(gl_info, format, format->glGammaInternal, GL_SRGB_WRITE,
query_format_flag(gl_info, format, format->srgb_internal, GL_SRGB_WRITE,
WINED3DFMT_FLAG_SRGB_WRITE, "sRGB write");
else
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_WRITE);
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_WRITE);
if (!(format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE)))
format->glGammaInternal = format->glInternal;
if (!(format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D]
& (WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE)))
format->srgb_internal = format->internal;
else if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
&& gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
format->glInternal = format->glGammaInternal;
format->internal = format->srgb_internal;
}
}
else
{
if (!gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX])
format_clear_flag(format, WINED3DFMT_FLAG_VTF);
format_clear_flag(&format->f, WINED3DFMT_FLAG_VTF);
if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING))
format_set_flag(format, WINED3DFMT_FLAG_FILTERING);
else if (format->id != WINED3DFMT_R32G32B32A32_FLOAT && format->id != WINED3DFMT_R32_FLOAT)
format_clear_flag(format, WINED3DFMT_FLAG_VTF);
format_set_flag(&format->f, WINED3DFMT_FLAG_FILTERING);
else if (format->f.id != WINED3DFMT_R32G32B32A32_FLOAT && format->f.id != WINED3DFMT_R32_FLOAT)
format_clear_flag(&format->f, WINED3DFMT_FLAG_VTF);
if (srgb_format || format->glGammaInternal != format->glInternal)
if (srgb_format || format->srgb_internal != format->internal)
{
/* Filter sRGB capabilities if EXT_texture_sRGB is not supported. */
if (!gl_info->supported[EXT_TEXTURE_SRGB])
{
format->glGammaInternal = format->glInternal;
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
format->srgb_internal = format->internal;
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
}
else if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
&& gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
{
format->glInternal = format->glGammaInternal;
format->internal = format->srgb_internal;
}
}
if ((format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SRGB_WRITE) && !srgb_write_supported)
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_WRITE);
if ((format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_SRGB_WRITE) && !srgb_write_supported)
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_WRITE);
if (!gl_info->supported[ARB_DEPTH_TEXTURE]
&& texture_info->flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
{
format->flags[WINED3D_GL_RES_TYPE_TEX_1D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->flags[WINED3D_GL_RES_TYPE_TEX_2D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3DFMT_FLAG_TEXTURE;
format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_1D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_CUBE] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_RECT] &= ~WINED3DFMT_FLAG_TEXTURE;
}
}
query_view_class(wined3d_format_gl_mutable(format));
query_view_class(format);
if (format->glInternal && format->flags[WINED3D_GL_RES_TYPE_RB]
if (format->internal && format->f.flags[WINED3D_GL_RES_TYPE_RB]
& (WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))
{
if (gl_info->supported[ARB_INTERNALFORMAT_QUERY])
{
target = gl_info->supported[ARB_TEXTURE_MULTISAMPLE] ? GL_TEXTURE_2D_MULTISAMPLE : GL_RENDERBUFFER;
count = 0;
GL_EXTCALL(glGetInternalformativ(target, format->glInternal,
GL_EXTCALL(glGetInternalformativ(target, format->internal,
GL_NUM_SAMPLE_COUNTS, 1, &count));
if (count > ARRAY_SIZE(multisample_types))
FIXME("Unexpectedly high number of multisample types %d.\n", count);
count = min(count, ARRAY_SIZE(multisample_types));
GL_EXTCALL(glGetInternalformativ(target, format->glInternal,
GL_EXTCALL(glGetInternalformativ(target, format->internal,
GL_SAMPLES, count, multisample_types));
checkGLcall("query sample counts");
for (i = 0; i < count; ++i)
{
if (multisample_types[i] > sizeof(format->multisample_types) * CHAR_BIT)
if (multisample_types[i] > sizeof(format->f.multisample_types) * CHAR_BIT)
continue;
format->multisample_types |= 1u << (multisample_types[i] - 1);
format->f.multisample_types |= 1u << (multisample_types[i] - 1);
}
}
else
{
max_log2 = wined3d_log2i(min(gl_info->limits.samples,
sizeof(format->multisample_types) * CHAR_BIT));
sizeof(format->f.multisample_types) * CHAR_BIT));
for (i = 1; i <= max_log2; ++i)
format->multisample_types |= 1u << ((1u << i) - 1);
format->f.multisample_types |= 1u << ((1u << i) - 1);
}
}
}
static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
{
struct wined3d_format *format, *srgb_format;
struct wined3d_format_gl *format, *srgb_format;
struct fragment_caps fragment_caps;
struct shader_caps shader_caps;
unsigned int i, j;
@ -3132,7 +3139,7 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
for (i = 0; i < ARRAY_SIZE(format_texture_info); ++i)
{
if (!(format = get_format_internal(adapter, format_texture_info[i].id)))
if (!(format = get_format_gl_internal(adapter, format_texture_info[i].id)))
return FALSE;
if (!gl_info->supported[format_texture_info[i].extension])
@ -3141,62 +3148,62 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
/* ARB_texture_rg defines floating point formats, but only if
* ARB_texture_float is also supported. */
if (!gl_info->supported[ARB_TEXTURE_FLOAT]
&& (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT))
&& (format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT))
continue;
/* ARB_texture_rg defines integer formats if EXT_texture_integer is also supported. */
if (!gl_info->supported[EXT_TEXTURE_INTEGER]
&& (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_INTEGER))
&& (format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_INTEGER))
continue;
format->glInternal = format_texture_info[i].gl_internal;
format->glGammaInternal = format_texture_info[i].gl_srgb_internal;
format->rtInternal = format_texture_info[i].gl_rt_internal;
format->glFormat = format_texture_info[i].gl_format;
format->glType = format_texture_info[i].gl_type;
format->color_fixup = COLOR_FIXUP_IDENTITY;
format->height_scale.numerator = 1;
format->height_scale.denominator = 1;
format->internal = format_texture_info[i].gl_internal;
format->srgb_internal = format_texture_info[i].gl_srgb_internal;
format->rt_internal = format_texture_info[i].gl_rt_internal;
format->format = format_texture_info[i].gl_format;
format->type = format_texture_info[i].gl_type;
format->f.color_fixup = COLOR_FIXUP_IDENTITY;
format->f.height_scale.numerator = 1;
format->f.height_scale.denominator = 1;
format->flags[WINED3D_GL_RES_TYPE_TEX_1D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->flags[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->flags[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_1D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_BUFFER] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
/* GL_ARB_depth_texture does not support 3D textures. It also says "cube textures are
* problematic", but doesn't explicitly mandate that an error is generated. */
if (gl_info->supported[EXT_TEXTURE3D]
&& !(format_texture_info[i].flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)))
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
format->flags[WINED3D_GL_RES_TYPE_TEX_CUBE] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_CUBE] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
if (gl_info->supported[ARB_TEXTURE_RECTANGLE])
format->flags[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_TEX_RECT] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->flags[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->flags[WINED3D_GL_RES_TYPE_RB] &= ~WINED3DFMT_FLAG_TEXTURE;
format->f.flags[WINED3D_GL_RES_TYPE_RB] |= format_texture_info[i].flags | WINED3DFMT_FLAG_BLIT;
format->f.flags[WINED3D_GL_RES_TYPE_RB] &= ~WINED3DFMT_FLAG_TEXTURE;
if (format->glGammaInternal != format->glInternal
if (format->srgb_internal != format->internal
&& !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL))
{
format->glGammaInternal = format->glInternal;
format_clear_flag(format, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
format->srgb_internal = format->internal;
format_clear_flag(&format->f, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
}
query_internal_format(adapter, format, &format_texture_info[i], gl_info, srgb_write, FALSE);
/* Texture conversion stuff */
format->conv_byte_count = format_texture_info[i].conv_byte_count;
format->upload = format_texture_info[i].upload;
format->download = format_texture_info[i].download;
format->f.conv_byte_count = format_texture_info[i].conv_byte_count;
format->f.upload = format_texture_info[i].upload;
format->f.download = format_texture_info[i].download;
srgb_format = NULL;
for (j = 0; j < ARRAY_SIZE(format_srgb_info); ++j)
{
if (format_srgb_info[j].base_format_id == format->id)
if (format_srgb_info[j].base_format_id == format->f.id)
{
if (!(srgb_format = get_format_internal(adapter, format_srgb_info[j].srgb_format_id)))
if (!(srgb_format = get_format_gl_internal(adapter, format_srgb_info[j].srgb_format_id)))
return FALSE;
break;
}
@ -3204,14 +3211,14 @@ static BOOL init_format_texture_info(struct wined3d_adapter *adapter, struct win
if (!srgb_format)
continue;
copy_format(adapter, srgb_format, format);
copy_format(adapter, &srgb_format->f, &format->f);
if (gl_info->supported[EXT_TEXTURE_SRGB]
&& !(adapter->d3d_info.wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL))
{
srgb_format->glInternal = format_texture_info[i].gl_srgb_internal;
srgb_format->glGammaInternal = format_texture_info[i].gl_srgb_internal;
format_set_flag(srgb_format, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
srgb_format->internal = format_texture_info[i].gl_srgb_internal;
srgb_format->srgb_internal = format_texture_info[i].gl_srgb_internal;
format_set_flag(&srgb_format->f, WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE);
query_internal_format(adapter, srgb_format, &format_texture_info[i], gl_info, srgb_write, TRUE);
}
}
@ -3335,7 +3342,7 @@ static void init_format_filter_info(struct wined3d_adapter *adapter,
struct wined3d_gl_info *gl_info)
{
enum wined3d_pci_vendor vendor = adapter->driver_info.vendor;
struct wined3d_format *format;
struct wined3d_format_gl *format;
unsigned int i;
static const enum wined3d_format_id fmts16[] =
{
@ -3373,8 +3380,8 @@ static void init_format_filter_info(struct wined3d_adapter *adapter,
{
for (i = 0; i < ARRAY_SIZE(fmts16); ++i)
{
format = get_format_internal(adapter, fmts16[i]);
format_set_flag(format, WINED3DFMT_FLAG_FILTERING);
format = get_format_gl_internal(adapter, fmts16[i]);
format_set_flag(&format->f, WINED3DFMT_FLAG_FILTERING);
}
}
return;
@ -3382,19 +3389,19 @@ static void init_format_filter_info(struct wined3d_adapter *adapter,
for (i = 0; i < ARRAY_SIZE(fmts16); ++i)
{
format = get_format_internal(adapter, fmts16[i]);
if (!format->glInternal)
format = get_format_gl_internal(adapter, fmts16[i]);
if (!format->internal)
continue; /* Not supported by GL */
filtered = check_filter(gl_info, format->glInternal);
filtered = check_filter(gl_info, format->internal);
if (filtered)
{
TRACE("Format %s supports filtering.\n", debug_d3dformat(format->id));
format_set_flag(format, WINED3DFMT_FLAG_FILTERING);
TRACE("Format %s supports filtering.\n", debug_d3dformat(format->f.id));
format_set_flag(&format->f, WINED3DFMT_FLAG_FILTERING);
}
else
{
TRACE("Format %s does not support filtering.\n", debug_d3dformat(format->id));
TRACE("Format %s does not support filtering.\n", debug_d3dformat(format->f.id));
}
}
}
@ -3455,7 +3462,7 @@ static struct color_fixup_desc create_color_fixup_desc_from_string(const char *s
static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_gl_info *gl_info)
{
const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
struct wined3d_format *format;
struct wined3d_format_gl *format;
BOOL use_legacy_fixups;
unsigned int i;
@ -3527,79 +3534,79 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
if (!gl_info->supported[fixups[i].extension])
continue;
format = get_format_internal(adapter, fixups[i].id);
format->color_fixup = create_color_fixup_desc_from_string(fixups[i].fixup);
format = get_format_gl_internal(adapter, fixups[i].id);
format->f.color_fixup = create_color_fixup_desc_from_string(fixups[i].fixup);
}
if (!gl_info->supported[APPLE_YCBCR_422] && (gl_info->supported[ARB_FRAGMENT_PROGRAM]
|| (gl_info->supported[ARB_FRAGMENT_SHADER] && gl_info->supported[ARB_VERTEX_SHADER])))
{
format = get_format_internal(adapter, WINED3DFMT_YUY2);
format->color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
format = get_format_gl_internal(adapter, WINED3DFMT_YUY2);
format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YUY2);
format = get_format_internal(adapter, WINED3DFMT_UYVY);
format->color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
format = get_format_gl_internal(adapter, WINED3DFMT_UYVY);
format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_UYVY);
}
else if (!gl_info->supported[APPLE_YCBCR_422] && (!gl_info->supported[ARB_FRAGMENT_PROGRAM]
&& (!gl_info->supported[ARB_FRAGMENT_SHADER] || !gl_info->supported[ARB_VERTEX_SHADER])))
{
format = get_format_internal(adapter, WINED3DFMT_YUY2);
format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_gl_internal(adapter, WINED3DFMT_YUY2);
format_clear_flag(&format->f, WINED3DFMT_FLAG_BLIT);
format->internal = 0;
format = get_format_internal(adapter, WINED3DFMT_UYVY);
format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_gl_internal(adapter, WINED3DFMT_UYVY);
format_clear_flag(&format->f, WINED3DFMT_FLAG_BLIT);
format->internal = 0;
}
if (gl_info->supported[ARB_FRAGMENT_PROGRAM]
|| (gl_info->supported[ARB_FRAGMENT_SHADER] && gl_info->supported[ARB_VERTEX_SHADER]))
{
format = get_format_internal(adapter, WINED3DFMT_YV12);
format_set_flag(format, WINED3DFMT_FLAG_HEIGHT_SCALE);
format->height_scale.numerator = 3;
format->height_scale.denominator = 2;
format->color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
format = get_format_gl_internal(adapter, WINED3DFMT_YV12);
format_set_flag(&format->f, WINED3DFMT_FLAG_HEIGHT_SCALE);
format->f.height_scale.numerator = 3;
format->f.height_scale.denominator = 2;
format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
format = get_format_internal(adapter, WINED3DFMT_NV12);
format_set_flag(format, WINED3DFMT_FLAG_HEIGHT_SCALE);
format->height_scale.numerator = 3;
format->height_scale.denominator = 2;
format->color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_NV12);
format = get_format_gl_internal(adapter, WINED3DFMT_NV12);
format_set_flag(&format->f, WINED3DFMT_FLAG_HEIGHT_SCALE);
format->f.height_scale.numerator = 3;
format->f.height_scale.denominator = 2;
format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_NV12);
}
else
{
format = get_format_internal(adapter, WINED3DFMT_YV12);
format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_gl_internal(adapter, WINED3DFMT_YV12);
format_clear_flag(&format->f, WINED3DFMT_FLAG_BLIT);
format->internal = 0;
format = get_format_internal(adapter, WINED3DFMT_NV12);
format_clear_flag(format, WINED3DFMT_FLAG_BLIT);
format->glInternal = 0;
format = get_format_gl_internal(adapter, WINED3DFMT_NV12);
format_clear_flag(&format->f, WINED3DFMT_FLAG_BLIT);
format->internal = 0;
}
if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER])
{
format = get_format_internal(adapter, WINED3DFMT_P8_UINT);
format->color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
format = get_format_gl_internal(adapter, WINED3DFMT_P8_UINT);
format->f.color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
}
if (!gl_info->supported[ARB_HALF_FLOAT_PIXEL])
{
format = get_format_internal(adapter, WINED3DFMT_R16_FLOAT);
format_clear_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_R16_FLOAT);
format_clear_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
format = get_format_internal(adapter, WINED3DFMT_R16G16_FLOAT);
format_clear_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_R16G16_FLOAT);
format_clear_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
format = get_format_internal(adapter, WINED3DFMT_R16G16B16A16_FLOAT);
format_clear_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_R16G16B16A16_FLOAT);
format_clear_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
}
if (gl_info->quirks & WINED3D_QUIRK_BROKEN_RGBA16)
{
format = get_format_internal(adapter, WINED3DFMT_R16G16B16A16_UNORM);
format_clear_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_R16G16B16A16_UNORM);
format_clear_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
}
/* ATI instancing hack: Although ATI cards do not support Shader Model
@ -3617,8 +3624,8 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
/* FIXME: This should just check the shader backend caps. */
if (gl_info->supported[ARB_VERTEX_PROGRAM] || gl_info->supported[ARB_VERTEX_SHADER])
{
format = get_format_internal(adapter, WINED3DFMT_INST);
format_set_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_INST);
format_set_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
}
/* Depth bound test. To query if the card supports it CheckDeviceFormat()
@ -3629,8 +3636,8 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
* value. */
if (gl_info->supported[EXT_DEPTH_BOUNDS_TEST])
{
format = get_format_internal(adapter, WINED3DFMT_NVDB);
format_set_flag(format, WINED3DFMT_FLAG_TEXTURE);
format = get_format_gl_internal(adapter, WINED3DFMT_NVDB);
format_set_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
}
/* RESZ aka AMD DX9-level hack for multisampled depth buffer resolve. You query for RESZ
@ -3638,27 +3645,27 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
* RENDERTARGET usage. */
if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT])
{
format = get_format_internal(adapter, WINED3DFMT_RESZ);
format_set_flag(format, WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET);
format = get_format_gl_internal(adapter, WINED3DFMT_RESZ);
format_set_flag(&format->f, WINED3DFMT_FLAG_TEXTURE | WINED3DFMT_FLAG_RENDERTARGET);
}
for (i = 0; i < WINED3D_FORMAT_COUNT; ++i)
{
struct wined3d_format *format = get_format_by_idx(adapter, i);
format = get_format_gl_by_idx(adapter, i);
if (!(format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_TEXTURE))
if (!(format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_TEXTURE))
continue;
if (is_identity_fixup(format->color_fixup))
if (is_identity_fixup(format->f.color_fixup))
continue;
TRACE("Checking support for fixup:\n");
dump_color_fixup_desc(format->color_fixup);
if (!adapter->shader_backend->shader_color_fixup_supported(format->color_fixup)
|| !adapter->fragment_pipe->color_fixup_supported(format->color_fixup))
dump_color_fixup_desc(format->f.color_fixup);
if (!adapter->shader_backend->shader_color_fixup_supported(format->f.color_fixup)
|| !adapter->fragment_pipe->color_fixup_supported(format->f.color_fixup))
{
TRACE("[FAILED]\n");
format_clear_flag(format, WINED3DFMT_FLAG_TEXTURE);
format_clear_flag(&format->f, WINED3DFMT_FLAG_TEXTURE);
}
else
{
@ -3668,18 +3675,18 @@ static void apply_format_fixups(struct wined3d_adapter *adapter, struct wined3d_
/* These formats are not supported for 3D textures. See also
* WINED3DFMT_FLAG_DECOMPRESS. */
format = get_format_internal(adapter, WINED3DFMT_ATI1N);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_internal(adapter, WINED3DFMT_ATI2N);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_internal(adapter, WINED3DFMT_BC4_UNORM);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_internal(adapter, WINED3DFMT_BC4_SNORM);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_internal(adapter, WINED3DFMT_BC5_UNORM);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_internal(adapter, WINED3DFMT_BC5_SNORM);
format->flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_ATI1N);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_ATI2N);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_BC4_UNORM);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_BC4_SNORM);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_BC5_UNORM);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
format = get_format_gl_internal(adapter, WINED3DFMT_BC5_SNORM);
format->f.flags[WINED3D_GL_RES_TYPE_TEX_3D] &= ~WINED3DFMT_FLAG_TEXTURE;
}
static BOOL init_format_vertex_info(const struct wined3d_adapter *adapter,
@ -3936,22 +3943,22 @@ static void init_format_depth_bias_scale(struct wined3d_adapter *adapter,
for (i = 0; i < WINED3D_FORMAT_COUNT; ++i)
{
struct wined3d_format *format = get_format_by_idx(adapter, i);
struct wined3d_format_gl *format = get_format_gl_by_idx(adapter, i);
if (format->flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_DEPTH)
if (format->f.flags[WINED3D_GL_RES_TYPE_RB] & WINED3DFMT_FLAG_DEPTH)
{
TRACE("Testing depth bias scale for format %s.\n", debug_d3dformat(format->id));
format->depth_bias_scale = wined3d_adapter_find_polyoffset_scale(ctx, format->glInternal);
TRACE("Testing depth bias scale for format %s.\n", debug_d3dformat(format->f.id));
format->f.depth_bias_scale = wined3d_adapter_find_polyoffset_scale(ctx, format->internal);
if (!(d3d_info->wined3d_creation_flags & WINED3D_NORMALIZED_DEPTH_BIAS))
{
/* The single-precision binary floating-point format has
* a significand precision of 24 bits.
*/
if (format->flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT)
format->depth_bias_scale /= 1u << 24;
if (format->f.flags[WINED3D_GL_RES_TYPE_TEX_2D] & WINED3DFMT_FLAG_FLOAT)
format->f.depth_bias_scale /= 1u << 24;
else
format->depth_bias_scale /= 1u << format->depth_size;
format->f.depth_bias_scale /= 1u << format->f.depth_size;
}
}
}

View File

@ -169,11 +169,13 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
const struct wined3d_view_desc *desc, struct wined3d_texture *texture,
const struct wined3d_format *view_format)
{
const struct wined3d_format_gl *view_format_gl;
unsigned int level_idx, layer_idx, layer_count;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
GLuint texture_name;
view_format_gl = wined3d_format_gl(view_format);
view->target = view_target;
context = context_acquire(texture->resource.device, NULL, 0);
@ -201,11 +203,11 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
}
gl_info->gl_ops.gl.p_glGenTextures(1, &view->name);
GL_EXTCALL(glTextureView(view->name, view->target, texture_name, view_format->glInternal,
GL_EXTCALL(glTextureView(view->name, view->target, texture_name, view_format_gl->internal,
level_idx, desc->u.texture.level_count, layer_idx, layer_count));
checkGLcall("create texture view");
if (is_stencil_view_format(view_format))
if (is_stencil_view_format(&view_format_gl->f))
{
static const GLint swizzle[] = {GL_ZERO, GL_RED, GL_ZERO, GL_ZERO};
@ -233,6 +235,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
unsigned int offset, unsigned int size)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_format_gl *view_format_gl;
if (!gl_info->supported[ARB_TEXTURE_BUFFER_OBJECT])
{
@ -247,6 +250,7 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
return;
}
view_format_gl = wined3d_format_gl(view_format);
wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_BUFFER);
view->target = GL_TEXTURE_BUFFER;
@ -255,14 +259,14 @@ static void create_buffer_texture(struct wined3d_gl_view *view, struct wined3d_c
context_bind_texture(context, GL_TEXTURE_BUFFER, view->name);
if (gl_info->supported[ARB_TEXTURE_BUFFER_RANGE])
{
GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format->glInternal,
GL_EXTCALL(glTexBufferRange(GL_TEXTURE_BUFFER, view_format_gl->internal,
buffer->buffer_object, offset, size));
}
else
{
if (offset || size != buffer->resource.size)
FIXME("OpenGL implementation does not support ARB_texture_buffer_range.\n");
GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format->glInternal, buffer->buffer_object));
GL_EXTCALL(glTexBuffer(GL_TEXTURE_BUFFER, view_format_gl->internal, buffer->buffer_object));
}
checkGLcall("Create buffer texture");
@ -1006,7 +1010,7 @@ void wined3d_unordered_access_view_clear_uint(struct wined3d_unordered_access_vi
const struct wined3d_uvec4 *clear_value, struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_format *format;
const struct wined3d_format_gl *format;
struct wined3d_resource *resource;
struct wined3d_buffer *buffer;
unsigned int offset, size;
@ -1024,12 +1028,12 @@ void wined3d_unordered_access_view_clear_uint(struct wined3d_unordered_access_vi
return;
}
format = view->format;
if (format->id != WINED3DFMT_R32_UINT && format->id != WINED3DFMT_R32_SINT
&& format->id != WINED3DFMT_R32G32B32A32_UINT
&& format->id != WINED3DFMT_R32G32B32A32_SINT)
format = wined3d_format_gl(view->format);
if (format->f.id != WINED3DFMT_R32_UINT && format->f.id != WINED3DFMT_R32_SINT
&& format->f.id != WINED3DFMT_R32G32B32A32_UINT
&& format->f.id != WINED3DFMT_R32G32B32A32_SINT)
{
FIXME("Not implemented for format %s.\n", debug_d3dformat(format->id));
FIXME("Not implemented for format %s.\n", debug_d3dformat(format->f.id));
return;
}
@ -1037,10 +1041,10 @@ void wined3d_unordered_access_view_clear_uint(struct wined3d_unordered_access_vi
wined3d_buffer_load_location(buffer, context, WINED3D_LOCATION_BUFFER);
wined3d_unordered_access_view_invalidate_location(view, ~WINED3D_LOCATION_BUFFER);
get_buffer_view_range(buffer, &view->desc, format, &offset, &size);
get_buffer_view_range(buffer, &view->desc, &format->f, &offset, &size);
context_bind_bo(context, buffer->buffer_type_hint, buffer->buffer_object);
GL_EXTCALL(glClearBufferSubData(buffer->buffer_type_hint, format->glInternal,
offset, size, format->glFormat, format->glType, clear_value));
GL_EXTCALL(glClearBufferSubData(buffer->buffer_type_hint, format->internal,
offset, size, format->format, format->type, clear_value));
checkGLcall("clear unordered access view");
}

View File

@ -4339,11 +4339,6 @@ struct wined3d_format
enum wined3d_ffp_emit_idx emit_idx;
GLint glInternal;
GLint glGammaInternal;
GLint rtInternal;
GLint glFormat;
GLint glType;
UINT conv_byte_count;
DWORD multisample_types;
unsigned int flags[WINED3D_GL_RES_TYPE_COUNT];
@ -4387,6 +4382,12 @@ struct wined3d_format_gl
GLenum vtx_type;
GLint vtx_format;
GLint internal;
GLint srgb_internal;
GLint rt_internal;
GLint format;
GLint type;
GLenum view_class;
};