Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2018
- 60 participants
- 608 discussions
[PATCH 3/5] wined3d: Validate required OpenGL extensions in wined3d_texture_gl_init() instead of wined3d_texture_init().
by Henri Verbeet 30 Oct '18
by Henri Verbeet 30 Oct '18
30 Oct '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/texture.c | 34 +++++++++++++++-------------------
1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 9b9e825f4fb..907ede7010f 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2881,26 +2881,10 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
if (!desc->width || !desc->height || !desc->depth)
return WINED3DERR_INVALIDCALL;
- if (desc->resource_type == WINED3D_RTYPE_TEXTURE_3D)
+ if (desc->resource_type == WINED3D_RTYPE_TEXTURE_3D && layer_count != 1)
{
- if (layer_count != 1)
- {
- ERR("Invalid layer count for volume texture.\n");
- return E_INVALIDARG;
- }
-
- if (!gl_info->supported[EXT_TEXTURE3D])
- {
- WARN("OpenGL implementation does not support 3D textures.\n");
- return WINED3DERR_INVALIDCALL;
- }
- }
-
- if (!(desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) && layer_count > 1
- && !gl_info->supported[EXT_TEXTURE_ARRAY])
- {
- WARN("OpenGL implementation does not support array textures.\n");
- return WINED3DERR_INVALIDCALL;
+ ERR("Invalid layer count for volume texture.\n");
+ return E_INVALIDARG;
}
texture->sub_resources = sub_resources;
@@ -3562,6 +3546,13 @@ static HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, st
texture_gl, device, desc, layer_count, level_count,
flags, parent, parent_ops, sub_resources);
+ if (!(desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP) && layer_count > 1
+ && !gl_info->supported[EXT_TEXTURE_ARRAY])
+ {
+ WARN("OpenGL implementation does not support array textures.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
switch (desc->resource_type)
{
case WINED3D_RTYPE_TEXTURE_1D:
@@ -3595,6 +3586,11 @@ static HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, st
break;
case WINED3D_RTYPE_TEXTURE_3D:
+ if (!gl_info->supported[EXT_TEXTURE3D])
+ {
+ WARN("OpenGL implementation does not support 3D textures.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
texture_ops = &texture3d_ops;
texture_gl->target = GL_TEXTURE_3D;
break;
--
2.11.0
2
1
[PATCH 2/5] wined3d: Move the "target" field from struct wined3d_texture to struct wined3d_texture_gl.
by Henri Verbeet 30 Oct '18
by Henri Verbeet 30 Oct '18
30 Oct '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 29 +++---
dlls/wined3d/context.c | 6 +-
dlls/wined3d/cs.c | 2 +-
dlls/wined3d/glsl_shader.c | 25 +++---
dlls/wined3d/nvidia_texture_shader.c | 7 +-
dlls/wined3d/sampler.c | 2 +-
dlls/wined3d/shader.c | 8 +-
dlls/wined3d/state.c | 30 ++++---
dlls/wined3d/surface.c | 64 +++++++------
dlls/wined3d/texture.c | 169 +++++++++++++++++------------------
dlls/wined3d/utils.c | 10 +--
dlls/wined3d/view.c | 28 +++---
dlls/wined3d/wined3d_private.h | 43 ++++-----
13 files changed, 213 insertions(+), 210 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 24f7e045fc5..62118fe0c6d 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7542,7 +7542,7 @@ static GLuint arbfp_gen_plain_shader(const struct wined3d_gl_info *gl_info, cons
/* Context activation is done by the caller. */
static HRESULT arbfp_blit_set(struct wined3d_arbfp_blitter *blitter, struct wined3d_context *context,
- const struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ const struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx,
const struct wined3d_color_key *color_key)
{
enum complex_fixup fixup;
@@ -7555,18 +7555,18 @@ static HRESULT arbfp_blit_set(struct wined3d_arbfp_blitter *blitter, struct wine
unsigned int level;
GLuint shader;
- level = sub_resource_idx % texture->level_count;
- size.x = wined3d_texture_get_level_pow2_width(texture, level);
- size.y = wined3d_texture_get_level_pow2_height(texture, level);
+ level = sub_resource_idx % texture_gl->t.level_count;
+ size.x = wined3d_texture_get_level_pow2_width(&texture_gl->t, level);
+ size.y = wined3d_texture_get_level_pow2_height(&texture_gl->t, level);
size.z = 1.0f;
size.w = 1.0f;
- if (is_complex_fixup(texture->resource.format->color_fixup))
- fixup = get_complex_fixup(texture->resource.format->color_fixup);
+ if (is_complex_fixup(texture_gl->t.resource.format->color_fixup))
+ fixup = get_complex_fixup(texture_gl->t.resource.format->color_fixup);
else
fixup = COMPLEX_FIXUP_NONE;
- switch (texture->target)
+ switch (texture_gl->target)
{
case GL_TEXTURE_1D:
type.res_type = WINED3D_GL_RES_TYPE_TEX_1D;
@@ -7589,7 +7589,7 @@ static HRESULT arbfp_blit_set(struct wined3d_arbfp_blitter *blitter, struct wine
break;
default:
- ERR("Unexpected GL texture type %#x.\n", texture->target);
+ ERR("Unexpected GL texture type %#x.\n", texture_gl->target);
type.res_type = WINED3D_GL_RES_TYPE_TEX_2D;
}
type.fixup = fixup;
@@ -7606,7 +7606,7 @@ static HRESULT arbfp_blit_set(struct wined3d_arbfp_blitter *blitter, struct wine
switch (fixup)
{
case COMPLEX_FIXUP_NONE:
- if (!is_identity_fixup(texture->resource.format->color_fixup))
+ if (!is_identity_fixup(texture_gl->t.resource.format->color_fixup))
FIXME("Implement support for sign or swizzle fixups.\n");
shader = arbfp_gen_plain_shader(gl_info, &type);
break;
@@ -7648,7 +7648,7 @@ err_out:
}
if (fixup == COMPLEX_FIXUP_P8)
- upload_palette(blitter, texture, context);
+ upload_palette(blitter, &texture_gl->t, context);
gl_info->gl_ops.gl.p_glEnable(GL_FRAGMENT_PROGRAM_ARB);
checkGLcall("glEnable(GL_FRAGMENT_PROGRAM_ARB)");
@@ -7658,7 +7658,7 @@ err_out:
checkGLcall("glProgramLocalParameter4fvARB");
if (type.use_color_key)
{
- wined3d_format_get_float_color_key(texture->resource.format, color_key, float_color_key);
+ wined3d_format_get_float_color_key(texture_gl->t.resource.format, color_key, float_color_key);
GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,
ARBFP_BLIT_PARAM_COLOR_KEY_LOW, &float_color_key[0].r));
GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB,
@@ -7775,6 +7775,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
unsigned int dst_sub_resource_idx, DWORD dst_location, const RECT *dst_rect,
const struct wined3d_color_key *color_key, enum wined3d_texture_filter_type filter)
{
+ struct wined3d_texture_gl *src_texture_gl = wined3d_texture_gl(src_texture);
struct wined3d_device *device = dst_texture->resource.device;
struct wined3d_texture *staging_texture = NULL;
struct wined3d_arbfp_blitter *arbfp_blitter;
@@ -7850,7 +7851,7 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
* flip in the blitter, we don't actually need that flip anyway. So we
* use the surface's texture as scratch texture, and flip the source
* rectangle instead. */
- texture2d_load_fb_texture(src_texture, src_sub_resource_idx, FALSE, context);
+ texture2d_load_fb_texture(src_texture_gl, src_sub_resource_idx, FALSE, context);
s = *src_rect;
src_level = src_sub_resource_idx % src_texture->level_count;
@@ -7901,10 +7902,10 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
color_key = &alpha_test_key;
}
- arbfp_blit_set(arbfp_blitter, context, src_texture, src_sub_resource_idx, color_key);
+ arbfp_blit_set(arbfp_blitter, context, src_texture_gl, src_sub_resource_idx, color_key);
/* Draw a textured quad */
- context_draw_textured_quad(context, wined3d_texture_gl(src_texture),
+ context_draw_textured_quad(context, src_texture_gl,
src_sub_resource_idx, src_rect, dst_rect, filter);
/* Leave the opengl state valid for blitting */
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index fbe3d941de8..3446c8df9e9 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -462,7 +462,7 @@ static inline void context_set_fbo_key_for_render_target(const struct wined3d_co
return;
}
- key->objects[idx].target = wined3d_texture_get_sub_resource_target(&texture_gl->t, sub_resource_idx);
+ key->objects[idx].target = wined3d_texture_gl_get_sub_resource_target(texture_gl, sub_resource_idx);
key->objects[idx].level = sub_resource_idx % texture_gl->t.level_count;
key->objects[idx].layer = sub_resource_idx / texture_gl->t.level_count;
@@ -5596,7 +5596,7 @@ void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_te
}
quad[4];
- texture2d_get_blt_info(&texture_gl->t, sub_resource_idx, src_rect, &info);
+ texture2d_get_blt_info(texture_gl, sub_resource_idx, src_rect, &info);
level = sub_resource_idx % texture_gl->t.level_count;
context_bind_texture(context, info.bind_target, texture_gl->texture_rgb.name);
@@ -5674,7 +5674,7 @@ void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_
struct wined3d_blt_info info;
unsigned int level;
- texture2d_get_blt_info(&texture_gl->t, sub_resource_idx, src_rect, &info);
+ texture2d_get_blt_info(texture_gl, sub_resource_idx, src_rect, &info);
gl_info->gl_ops.gl.p_glEnable(info.bind_target);
checkGLcall("glEnable(bind_target)");
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 9114f0344ab..ffa4951c0ca 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -1351,7 +1351,7 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data)
if (InterlockedIncrement(&op->texture->resource.bind_count) == 1)
op->texture->sampler = op->stage;
- if (!prev || op->texture->target != prev->target
+ if (!prev || wined3d_texture_gl(op->texture)->target != wined3d_texture_gl(prev)->target
|| (!is_same_fixup(new_format->color_fixup, old_format->color_fixup)
&& !(can_use_texture_swizzle(gl_info, new_format) && can_use_texture_swizzle(gl_info, old_format)))
|| (new_fmt_flags & WINED3DFMT_FLAG_SHADOW) != (old_fmt_flags & WINED3DFMT_FLAG_SHADOW))
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index fc9730f64b9..37d2aab20bc 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -13063,7 +13063,7 @@ static void glsl_blitter_upload_palette(struct wined3d_glsl_blitter *blitter,
/* Context activation is done by the caller. */
static struct glsl_blitter_program *glsl_blitter_get_program(struct wined3d_glsl_blitter *blitter,
- struct wined3d_context *context, const struct wined3d_texture *texture)
+ struct wined3d_context *context, const struct wined3d_texture_gl *texture_gl)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct glsl_blitter_program *program;
@@ -13071,8 +13071,8 @@ static struct glsl_blitter_program *glsl_blitter_get_program(struct wined3d_glsl
struct wine_rb_entry *entry;
memset(&args, 0, sizeof(args));
- args.texture_type = texture->target;
- args.fixup = texture->resource.format->color_fixup;
+ args.texture_type = texture_gl->target;
+ args.fixup = texture_gl->t.resource.format->color_fixup;
if ((entry = wine_rb_get(&blitter->programs, &args)))
return WINE_RB_ENTRY_VALUE(entry, struct glsl_blitter_program, entry);
@@ -13103,11 +13103,11 @@ static struct glsl_blitter_program *glsl_blitter_get_program(struct wined3d_glsl
}
static BOOL glsl_blitter_supported(enum wined3d_blit_op blit_op, const struct wined3d_context *context,
- const struct wined3d_texture *src_texture, DWORD src_location,
- const struct wined3d_texture *dst_texture, DWORD dst_location)
+ const struct wined3d_texture_gl *src_texture, DWORD src_location,
+ const struct wined3d_texture_gl *dst_texture, DWORD dst_location)
{
- const struct wined3d_resource *src_resource = &src_texture->resource;
- const struct wined3d_resource *dst_resource = &dst_texture->resource;
+ const struct wined3d_resource *src_resource = &src_texture->t.resource;
+ const struct wined3d_resource *dst_resource = &dst_texture->t.resource;
const struct wined3d_format *src_format = src_resource->format;
const struct wined3d_format *dst_format = dst_resource->format;
BOOL decompress;
@@ -13166,6 +13166,8 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
unsigned int dst_sub_resource_idx, DWORD dst_location, const RECT *dst_rect,
const struct wined3d_color_key *colour_key, enum wined3d_texture_filter_type filter)
{
+ struct wined3d_texture_gl *src_texture_gl = wined3d_texture_gl(src_texture);
+ struct wined3d_texture_gl *dst_texture_gl = wined3d_texture_gl(dst_texture);
struct wined3d_device *device = dst_texture->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_texture *staging_texture = NULL;
@@ -13182,7 +13184,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
wine_dbgstr_rect(src_rect), dst_texture, dst_sub_resource_idx, wined3d_debug_location(dst_location),
wine_dbgstr_rect(dst_rect), colour_key, debug_d3dtexturefiltertype(filter));
- if (!glsl_blitter_supported(op, context, src_texture, src_location, dst_texture, dst_location))
+ if (!glsl_blitter_supported(op, context, src_texture_gl, src_location, dst_texture_gl, dst_location))
{
if (!(next = blitter->next))
{
@@ -13242,7 +13244,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
* flip in the blitter, we don't actually need that flip anyway. So we
* use the surface's texture as scratch texture, and flip the source
* rectangle instead. */
- texture2d_load_fb_texture(src_texture, src_sub_resource_idx, FALSE, context);
+ texture2d_load_fb_texture(src_texture_gl, src_sub_resource_idx, FALSE, context);
s = *src_rect;
src_level = src_sub_resource_idx % src_texture->level_count;
@@ -13285,7 +13287,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
context_invalidate_state(context, STATE_FRAMEBUFFER);
}
- if (!(program = glsl_blitter_get_program(glsl_blitter, context, src_texture)))
+ if (!(program = glsl_blitter_get_program(glsl_blitter, context, src_texture_gl)))
{
ERR("Failed to get blitter program.\n");
return dst_location;
@@ -13310,8 +13312,7 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
default:
break;
}
- context_draw_shaded_quad(context, wined3d_texture_gl(src_texture),
- src_sub_resource_idx, src_rect, dst_rect, filter);
+ context_draw_shaded_quad(context, src_texture_gl, src_sub_resource_idx, src_rect, dst_rect, filter);
GL_EXTCALL(glUseProgram(0));
if (dst_texture->swapchain && (dst_texture->swapchain->front_buffer == dst_texture))
diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c
index 20db62739b5..e05df20bfda 100644
--- a/dlls/wined3d/nvidia_texture_shader.c
+++ b/dlls/wined3d/nvidia_texture_shader.c
@@ -33,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d);
static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD stage, struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct wined3d_texture *texture;
BOOL bumpmap = FALSE;
if (stage > 0
@@ -47,9 +48,9 @@ static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD st
context->texShaderBumpMap &= ~(1u << stage);
}
- if (state->textures[stage])
+ if ((texture = state->textures[stage]))
{
- switch (state->textures[stage]->target)
+ switch (wined3d_texture_gl(texture)->target)
{
case GL_TEXTURE_2D:
gl_info->gl_ops.gl.p_glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV,
@@ -70,7 +71,7 @@ static void nvts_activate_dimensions(const struct wined3d_state *state, DWORD st
checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_SHADER_OPERATION_NV, GL_TEXTURE_CUBE_MAP_ARB)");
break;
default:
- FIXME("Unhandled target %#x.\n", state->textures[stage]->target);
+ FIXME("Unhandled target %#x.\n", wined3d_texture_gl(texture)->target);
break;
}
}
diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
index 458a330774f..6e45f0e4b4e 100644
--- a/dlls/wined3d/sampler.c
+++ b/dlls/wined3d/sampler.c
@@ -175,7 +175,7 @@ static void texture_gl_apply_base_level(struct wined3d_texture_gl *texture_gl,
* (default 0), while GL_TEXTURE_MAX_LEVEL specifies the smallest
* mipmap used (default 1000). So WINED3D_SAMP_MAX_MIP_LEVEL
* corresponds to GL_TEXTURE_BASE_LEVEL. */
- gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_BASE_LEVEL, base_level);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target, GL_TEXTURE_BASE_LEVEL, base_level);
gl_tex->base_level = base_level;
}
}
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index ce45298b539..e11a37cf078 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -3847,7 +3847,7 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
{
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
const struct wined3d_gl_info *gl_info = context->gl_info;
- const struct wined3d_texture *texture;
+ struct wined3d_texture *texture;
unsigned int i;
memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
@@ -3922,18 +3922,16 @@ void find_ps_compile_args(const struct wined3d_state *state, const struct wined3
{
for (i = 0; i < shader->limits->sampler; ++i)
{
- const struct wined3d_texture *texture = state->textures[i];
-
if (!shader->reg_maps.resource_info[i].type)
continue;
/* Treat unbound textures as 2D. The dummy texture will provide
* the proper sample value. The tex_types bitmap defaults to
* 2D because of the memset. */
- if (!texture)
+ if (!(texture = state->textures[i]))
continue;
- switch (texture->target)
+ switch (wined3d_texture_gl(texture)->target)
{
/* RECT textures are distinguished from 2D textures via np2_fixup */
default:
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index 7f3961b7465..42c109da57b 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3213,12 +3213,13 @@ void tex_alphaop(struct wined3d_context *context, const struct wined3d_state *st
if (state->render_states[WINED3D_RS_COLORKEYENABLE] && !stage && state->textures[0])
{
- struct wined3d_texture *texture = state->textures[0];
- GLenum texture_dimensions = texture->target;
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(state->textures[0]);
+ GLenum texture_dimensions = texture_gl->target;
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- if (texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT && !texture->resource.format->alpha_size)
+ if (texture_gl->t.async.color_key_flags & WINED3D_CKEY_SRC_BLT
+ && !texture_gl->t.resource.format->alpha_size)
{
/* Color keying needs to pass alpha values from the texture through to have the alpha test work
* properly. On the other hand applications can still use texture combiners apparently. This code
@@ -3516,7 +3517,7 @@ static void sampler_texmatrix(struct wined3d_context *context, const struct wine
}
}
-static enum wined3d_texture_address wined3d_texture_address_mode(const struct wined3d_texture *texture,
+static enum wined3d_texture_address wined3d_texture_gl_address_mode(const struct wined3d_texture_gl *texture_gl,
enum wined3d_texture_address t)
{
if (t < WINED3D_TADDRESS_WRAP || t > WINED3D_TADDRESS_MIRROR_ONCE)
@@ -3526,7 +3527,7 @@ static enum wined3d_texture_address wined3d_texture_address_mode(const struct wi
}
/* Cubemaps are always set to clamp, regardless of the sampler state. */
- if (texture->target == GL_TEXTURE_CUBE_MAP_ARB || ((texture->flags & WINED3D_TEXTURE_COND_NP2)
+ if (texture_gl->target == GL_TEXTURE_CUBE_MAP_ARB || ((texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2)
&& t == WINED3D_TADDRESS_WRAP))
return WINED3D_TADDRESS_CLAMP;
@@ -3534,7 +3535,8 @@ static enum wined3d_texture_address wined3d_texture_address_mode(const struct wi
}
static void wined3d_sampler_desc_from_sampler_states(struct wined3d_sampler_desc *desc,
- const struct wined3d_context *context, const DWORD *sampler_states, const struct wined3d_texture *texture)
+ const struct wined3d_context *context, const DWORD *sampler_states,
+ const struct wined3d_texture_gl *texture_gl)
{
union
{
@@ -3542,9 +3544,9 @@ static void wined3d_sampler_desc_from_sampler_states(struct wined3d_sampler_desc
DWORD d;
} lod_bias;
- desc->address_u = wined3d_texture_address_mode(texture, sampler_states[WINED3D_SAMP_ADDRESS_U]);
- desc->address_v = wined3d_texture_address_mode(texture, sampler_states[WINED3D_SAMP_ADDRESS_V]);
- desc->address_w = wined3d_texture_address_mode(texture, sampler_states[WINED3D_SAMP_ADDRESS_W]);
+ desc->address_u = wined3d_texture_gl_address_mode(texture_gl, sampler_states[WINED3D_SAMP_ADDRESS_U]);
+ desc->address_v = wined3d_texture_gl_address_mode(texture_gl, sampler_states[WINED3D_SAMP_ADDRESS_V]);
+ desc->address_w = wined3d_texture_gl_address_mode(texture_gl, sampler_states[WINED3D_SAMP_ADDRESS_W]);
wined3d_color_from_d3dcolor((struct wined3d_color *)desc->border_color,
sampler_states[WINED3D_SAMP_BORDER_COLOR]);
if (sampler_states[WINED3D_SAMP_MAG_FILTER] > WINED3D_TEXF_ANISOTROPIC)
@@ -3568,20 +3570,20 @@ static void wined3d_sampler_desc_from_sampler_states(struct wined3d_sampler_desc
if ((sampler_states[WINED3D_SAMP_MAG_FILTER] != WINED3D_TEXF_ANISOTROPIC
&& sampler_states[WINED3D_SAMP_MIN_FILTER] != WINED3D_TEXF_ANISOTROPIC
&& sampler_states[WINED3D_SAMP_MIP_FILTER] != WINED3D_TEXF_ANISOTROPIC)
- || (texture->flags & WINED3D_TEXTURE_COND_NP2))
+ || (texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2))
desc->max_anisotropy = 1;
- desc->compare = texture->resource.format_flags & WINED3DFMT_FLAG_SHADOW;
+ desc->compare = texture_gl->t.resource.format_flags & WINED3DFMT_FLAG_SHADOW;
desc->comparison_func = WINED3D_CMP_LESSEQUAL;
desc->srgb_decode = sampler_states[WINED3D_SAMP_SRGB_TEXTURE];
- if (!(texture->resource.format_flags & WINED3DFMT_FLAG_FILTERING))
+ if (!(texture_gl->t.resource.format_flags & WINED3DFMT_FLAG_FILTERING))
{
desc->mag_filter = WINED3D_TEXF_POINT;
desc->min_filter = WINED3D_TEXF_POINT;
desc->mip_filter = WINED3D_TEXF_NONE;
}
- if (texture->flags & WINED3D_TEXTURE_COND_NP2)
+ if (texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2)
{
desc->mip_filter = WINED3D_TEXF_NONE;
if (context->gl_info->supported[WINED3D_GL_NORMALIZED_TEXRECT])
@@ -3620,7 +3622,7 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
struct wined3d_sampler *sampler;
struct wine_rb_entry *entry;
- wined3d_sampler_desc_from_sampler_states(&desc, context, sampler_states, &texture_gl->t);
+ wined3d_sampler_desc_from_sampler_states(&desc, context, sampler_states, texture_gl);
wined3d_texture_gl_bind(texture_gl, context, srgb);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 02cd2c376c1..21375dd026f 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -137,13 +137,13 @@ static void texture2d_depth_blt_fbo(const struct wined3d_device *device, struct
checkGLcall("glBlitFramebuffer()");
}
-static BOOL is_multisample_location(const struct wined3d_texture *texture, DWORD location)
+static BOOL is_multisample_location(const struct wined3d_texture_gl *texture_gl, DWORD location)
{
if (location == WINED3D_LOCATION_RB_MULTISAMPLE)
return TRUE;
if (location != WINED3D_LOCATION_TEXTURE_RGB && location != WINED3D_LOCATION_TEXTURE_SRGB)
return FALSE;
- return texture->target == GL_TEXTURE_2D_MULTISAMPLE || texture->target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
+ return texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE || texture_gl->target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
}
/* Blit between surface locations. Onscreen on different swapchains is not supported.
@@ -183,7 +183,7 @@ static void texture2d_blt_fbo(const struct wined3d_device *device, struct wined3
}
/* Resolve the source surface first if needed. */
- if (is_multisample_location(src_texture, src_location)
+ if (is_multisample_location(wined3d_texture_gl(src_texture), src_location)
&& (src_texture->resource.format->id != dst_texture->resource.format->id
|| abs(src_rect->bottom - src_rect->top) != abs(dst_rect->bottom - dst_rect->top)
|| abs(src_rect->right - src_rect->left) != abs(dst_rect->right - dst_rect->left)))
@@ -835,41 +835,44 @@ error:
*
* Context activation is done by the caller. This function may temporarily
* switch to a different context and restore the original one before return. */
-void texture2d_load_fb_texture(struct wined3d_texture *texture,
+void texture2d_load_fb_texture(struct wined3d_texture_gl *texture_gl,
unsigned int sub_resource_idx, BOOL srgb, struct wined3d_context *context)
{
- struct wined3d_device *device = texture->resource.device;
struct wined3d_texture *restore_texture;
const struct wined3d_gl_info *gl_info;
+ struct wined3d_resource *resource;
unsigned int restore_idx, level;
+ struct wined3d_device *device;
GLenum target;
+ resource = &texture_gl->t.resource;
+ device = resource->device;
restore_texture = context->current_rt.texture;
restore_idx = context->current_rt.sub_resource_idx;
- if (restore_texture != texture || restore_idx != sub_resource_idx)
- context = context_acquire(device, texture, sub_resource_idx);
+ if (restore_texture != &texture_gl->t || restore_idx != sub_resource_idx)
+ context = context_acquire(device, &texture_gl->t, sub_resource_idx);
else
restore_texture = NULL;
gl_info = context->gl_info;
device_invalidate_state(device, STATE_FRAMEBUFFER);
- wined3d_texture_prepare_texture(texture, context, srgb);
- wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, srgb);
+ wined3d_texture_prepare_texture(&texture_gl->t, context, srgb);
+ wined3d_texture_gl_bind_and_dirtify(texture_gl, context, srgb);
- TRACE("Reading back offscreen render target %p, %u.\n", texture, sub_resource_idx);
+ TRACE("Reading back offscreen render target %p, %u.\n", texture_gl, sub_resource_idx);
- if (wined3d_resource_is_offscreen(&texture->resource))
+ if (wined3d_resource_is_offscreen(resource))
gl_info->gl_ops.gl.p_glReadBuffer(context_get_offscreen_gl_buffer(context));
else
- gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(texture));
+ gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(&texture_gl->t));
checkGLcall("glReadBuffer");
- level = sub_resource_idx % texture->level_count;
- target = wined3d_texture_get_sub_resource_target(texture, sub_resource_idx);
+ level = sub_resource_idx % texture_gl->t.level_count;
+ target = wined3d_texture_gl_get_sub_resource_target(texture_gl, sub_resource_idx);
gl_info->gl_ops.gl.p_glCopyTexSubImage2D(target, level, 0, 0, 0, 0,
- wined3d_texture_get_level_width(texture, level),
- wined3d_texture_get_level_height(texture, level));
+ wined3d_texture_get_level_width(&texture_gl->t, level),
+ wined3d_texture_get_level_height(&texture_gl->t, level));
checkGLcall("glCopyTexSubImage2D");
if (restore_texture)
@@ -907,7 +910,7 @@ static void fb_copy_to_texture_direct(struct wined3d_texture_gl *dst_texture, un
wined3d_texture_load(&dst_texture->t, context, FALSE);
/* Bind the target texture */
- context_bind_texture(context, dst_texture->t.target, dst_texture->texture_rgb.name);
+ context_bind_texture(context, dst_texture->target, dst_texture->texture_rgb.name);
if (wined3d_resource_is_offscreen(&src_texture->t.resource))
{
TRACE("Reading from an offscreen target\n");
@@ -940,7 +943,7 @@ static void fb_copy_to_texture_direct(struct wined3d_texture_gl *dst_texture, un
dst_level = dst_sub_resource_idx % dst_texture->t.level_count;
src_height = wined3d_texture_get_level_height(&src_texture->t, src_level);
- dst_target = wined3d_texture_get_sub_resource_target(&dst_texture->t, dst_sub_resource_idx);
+ dst_target = wined3d_texture_gl_get_sub_resource_target(dst_texture, dst_sub_resource_idx);
if (upsidedown
&& !((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
&& !((yrel - 1.0f < -eps) || (yrel - 1.0f > eps)))
@@ -1015,8 +1018,8 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture_gl *dst_texture,
TRACE("Using hwstretch blit\n");
- src_target = wined3d_texture_get_sub_resource_target(&src_texture->t, src_sub_resource_idx);
- dst_target = wined3d_texture_get_sub_resource_target(&dst_texture->t, dst_sub_resource_idx);
+ src_target = wined3d_texture_gl_get_sub_resource_target(src_texture, src_sub_resource_idx);
+ dst_target = wined3d_texture_gl_get_sub_resource_target(dst_texture, dst_sub_resource_idx);
/* Activate the Proper context for reading from the source surface, set it up for blitting */
context = context_acquire(device, &src_texture->t, src_sub_resource_idx);
@@ -1423,7 +1426,7 @@ BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_res
wined3d_texture_prepare_location(texture, sub_resource_idx, context, dst_location);
/* We cannot download data from multisample textures directly. */
- if (is_multisample_location(texture, WINED3D_LOCATION_TEXTURE_RGB))
+ if (is_multisample_location(wined3d_texture_gl(texture), WINED3D_LOCATION_TEXTURE_RGB))
{
wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_RB_RESOLVED);
texture2d_read_from_framebuffer(texture, sub_resource_idx, context,
@@ -1528,7 +1531,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
&& wined3d_resource_is_offscreen(&texture->resource)
&& (sub_resource->locations & WINED3D_LOCATION_DRAWABLE))
{
- texture2d_load_fb_texture(texture, sub_resource_idx, srgb, context);
+ texture2d_load_fb_texture(wined3d_texture_gl(texture), sub_resource_idx, srgb, context);
return TRUE;
}
@@ -1840,6 +1843,8 @@ static DWORD raw_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
unsigned int dst_sub_resource_idx, DWORD dst_location, const RECT *dst_rect,
const struct wined3d_color_key *colour_key, enum wined3d_texture_filter_type filter)
{
+ struct wined3d_texture_gl *src_texture_gl = wined3d_texture_gl(src_texture);
+ struct wined3d_texture_gl *dst_texture_gl = wined3d_texture_gl(dst_texture);
const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int src_level, src_layer, dst_level, dst_layer;
struct wined3d_blitter *next;
@@ -1879,7 +1884,7 @@ static DWORD raw_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB;
if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, location))
ERR("Failed to load the source sub-resource into %s.\n", wined3d_debug_location(location));
- src_name = wined3d_texture_gl_get_texture_name(wined3d_texture_gl(src_texture),
+ src_name = wined3d_texture_gl_get_texture_name(src_texture_gl,
context, location == WINED3D_LOCATION_TEXTURE_SRGB);
location = dst_location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB);
@@ -1896,11 +1901,11 @@ static DWORD raw_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, location))
ERR("Failed to load the destination sub-resource into %s.\n", wined3d_debug_location(location));
}
- dst_name = wined3d_texture_gl_get_texture_name(wined3d_texture_gl(dst_texture),
+ dst_name = wined3d_texture_gl_get_texture_name(dst_texture_gl,
context, location == WINED3D_LOCATION_TEXTURE_SRGB);
- GL_EXTCALL(glCopyImageSubData(src_name, src_texture->target, src_level,
- src_rect->left, src_rect->top, src_layer, dst_name, dst_texture->target, dst_level,
+ GL_EXTCALL(glCopyImageSubData(src_name, src_texture_gl->target, src_level,
+ src_rect->left, src_rect->top, src_layer, dst_name, dst_texture_gl->target, dst_level,
dst_rect->left, dst_rect->top, dst_layer, src_rect->right - src_rect->left,
src_rect->bottom - src_rect->top, 1));
checkGLcall("copy image data");
@@ -2098,6 +2103,7 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
unsigned int dst_sub_resource_idx, DWORD dst_location, const RECT *dst_rect,
const struct wined3d_color_key *color_key, enum wined3d_texture_filter_type filter)
{
+ struct wined3d_texture_gl *src_texture_gl = wined3d_texture_gl(src_texture);
const struct wined3d_gl_info *gl_info = context->gl_info;
struct wined3d_resource *src_resource, *dst_resource;
struct wined3d_texture *staging_texture = NULL;
@@ -2198,7 +2204,7 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
context_invalidate_state(context, STATE_FRAMEBUFFER);
}
- gl_info->gl_ops.gl.p_glEnable(src_texture->target);
+ gl_info->gl_ops.gl.p_glEnable(src_texture_gl->target);
checkGLcall("glEnable(target)");
if (op == WINED3D_BLIT_OP_COLOR_BLIT_ALPHATEST || color_key)
@@ -2220,7 +2226,7 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
checkGLcall("glAlphaFunc");
}
- context_draw_textured_quad(context, wined3d_texture_gl(src_texture),
+ context_draw_textured_quad(context, src_texture_gl,
src_sub_resource_idx, src_rect, dst_rect, filter);
if (op == WINED3D_BLIT_OP_COLOR_BLIT_ALPHATEST || color_key)
@@ -3276,7 +3282,7 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
TRACE("Not doing download because of format conversion.\n");
else if (src_texture->resource.format->conv_byte_count)
TRACE("Not doing download because the source format needs conversion.\n");
- else if (is_multisample_location(src_texture, WINED3D_LOCATION_TEXTURE_RGB))
+ else if (is_multisample_location(wined3d_texture_gl(src_texture), WINED3D_LOCATION_TEXTURE_RGB))
TRACE("Not doing download because of multisample source.\n");
else if (!texture2d_is_full_rect(src_texture, src_sub_resource_idx % src_texture->level_count, &src_rect))
TRACE("Not doing download because of partial download (src).\n");
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index f1a2498f777..9b9e825f4fb 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -153,7 +153,7 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct wined
f->b = ((r->bottom * 2.0f) / h) - 1.0f;
}
-void texture2d_get_blt_info(const struct wined3d_texture *texture,
+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)
{
struct wined3d_vec3 *coords = info->texcoords;
@@ -162,10 +162,10 @@ void texture2d_get_blt_info(const struct wined3d_texture *texture,
GLenum target;
GLsizei w, h;
- level = sub_resource_idx % texture->level_count;
- w = wined3d_texture_get_level_pow2_width(texture, level);
- h = wined3d_texture_get_level_pow2_height(texture, level);
- target = wined3d_texture_get_sub_resource_target(texture, sub_resource_idx);
+ level = sub_resource_idx % texture_gl->t.level_count;
+ w = wined3d_texture_get_level_pow2_width(&texture_gl->t, level);
+ h = wined3d_texture_get_level_pow2_height(&texture_gl->t, level);
+ target = wined3d_texture_gl_get_sub_resource_target(texture_gl, sub_resource_idx);
switch (target)
{
@@ -564,7 +564,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,
+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)
{
@@ -572,34 +572,34 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
GLsizei width, height, depth;
GLenum target;
- level_count = texture->level_count;
- if (texture->target == GL_TEXTURE_1D_ARRAY || texture->target == GL_TEXTURE_2D_ARRAY)
+ level_count = texture_gl->t.level_count;
+ if (texture_gl->target == GL_TEXTURE_1D_ARRAY || texture_gl->target == GL_TEXTURE_2D_ARRAY)
layer_count = 1;
else
- layer_count = texture->layer_count;
+ layer_count = texture_gl->t.layer_count;
for (layer = 0; layer < layer_count; ++layer)
{
- target = wined3d_texture_get_sub_resource_target(texture, layer * level_count);
+ target = wined3d_texture_gl_get_sub_resource_target(texture_gl, layer * level_count);
for (level = 0; level < level_count; ++level)
{
- width = wined3d_texture_get_level_pow2_width(texture, level);
- height = wined3d_texture_get_level_pow2_height(texture, level);
- if (texture->resource.format_flags & WINED3DFMT_FLAG_HEIGHT_SCALE)
+ width = wined3d_texture_get_level_pow2_width(&texture_gl->t, level);
+ height = wined3d_texture_get_level_pow2_height(&texture_gl->t, level);
+ if (texture_gl->t.resource.format_flags & WINED3DFMT_FLAG_HEIGHT_SCALE)
{
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",
- texture, layer, level, target, width, height);
+ TRACE("texture_gl %p, layer %u, level %u, target %#x, width %u, height %u.\n",
+ texture_gl, layer, level, target, width, height);
if (target == GL_TEXTURE_3D || target == GL_TEXTURE_2D_ARRAY)
{
- depth = wined3d_texture_get_level_depth(texture, level);
+ depth = wined3d_texture_get_level_depth(&texture_gl->t, level);
GL_EXTCALL(glTexImage3D(target, level, gl_internal_format, width, height,
- target == GL_TEXTURE_2D_ARRAY ? texture->layer_count : depth, 0,
+ target == GL_TEXTURE_2D_ARRAY ? texture_gl->t.layer_count : depth, 0,
format->format, format->type, NULL));
checkGLcall("glTexImage3D");
}
@@ -611,7 +611,7 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
else
{
gl_info->gl_ops.gl.p_glTexImage2D(target, level, gl_internal_format, width,
- target == GL_TEXTURE_1D_ARRAY ? texture->layer_count : height, 0,
+ target == GL_TEXTURE_1D_ARRAY ? texture_gl->t.layer_count : height, 0,
format->format, format->type, NULL);
checkGLcall("glTexImage2D");
}
@@ -621,42 +621,42 @@ static void wined3d_texture_allocate_gl_mutable_storage(struct wined3d_texture *
/* Context activation is done by the caller. */
/* The caller is responsible for binding the correct texture. */
-static void wined3d_texture_allocate_gl_immutable_storage(struct wined3d_texture *texture,
+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)
{
- unsigned int samples = wined3d_texture_get_gl_sample_count(texture);
- GLsizei height = wined3d_texture_get_level_pow2_height(texture, 0);
- GLsizei width = wined3d_texture_get_level_pow2_width(texture, 0);
- GLboolean standard_pattern = texture->resource.multisample_type != WINED3D_MULTISAMPLE_NON_MASKABLE
- && texture->resource.multisample_quality == WINED3D_STANDARD_MULTISAMPLE_PATTERN;
+ unsigned int samples = wined3d_texture_get_gl_sample_count(&texture_gl->t);
+ GLsizei height = wined3d_texture_get_level_pow2_height(&texture_gl->t, 0);
+ GLsizei width = wined3d_texture_get_level_pow2_width(&texture_gl->t, 0);
+ GLboolean standard_pattern = texture_gl->t.resource.multisample_type != WINED3D_MULTISAMPLE_NON_MASKABLE
+ && texture_gl->t.resource.multisample_quality == WINED3D_STANDARD_MULTISAMPLE_PATTERN;
- switch (texture->target)
+ switch (texture_gl->target)
{
case GL_TEXTURE_3D:
- GL_EXTCALL(glTexStorage3D(texture->target, texture->level_count,
- gl_internal_format, width, height, wined3d_texture_get_level_depth(texture, 0)));
+ GL_EXTCALL(glTexStorage3D(texture_gl->target, texture_gl->t.level_count,
+ gl_internal_format, width, height, wined3d_texture_get_level_depth(&texture_gl->t, 0)));
break;
case GL_TEXTURE_2D_ARRAY:
- GL_EXTCALL(glTexStorage3D(texture->target, texture->level_count,
- gl_internal_format, width, height, texture->layer_count));
+ GL_EXTCALL(glTexStorage3D(texture_gl->target, texture_gl->t.level_count,
+ gl_internal_format, width, height, texture_gl->t.layer_count));
break;
case GL_TEXTURE_2D_MULTISAMPLE:
- GL_EXTCALL(glTexStorage2DMultisample(texture->target, samples,
+ GL_EXTCALL(glTexStorage2DMultisample(texture_gl->target, samples,
gl_internal_format, width, height, standard_pattern));
break;
case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
- GL_EXTCALL(glTexStorage3DMultisample(texture->target, samples,
- gl_internal_format, width, height, texture->layer_count, standard_pattern));
+ GL_EXTCALL(glTexStorage3DMultisample(texture_gl->target, samples,
+ gl_internal_format, width, height, texture_gl->t.layer_count, standard_pattern));
break;
case GL_TEXTURE_1D_ARRAY:
- GL_EXTCALL(glTexStorage2D(texture->target, texture->level_count,
- gl_internal_format, width, texture->layer_count));
+ GL_EXTCALL(glTexStorage2D(texture_gl->target, texture_gl->t.level_count,
+ gl_internal_format, width, texture_gl->t.layer_count));
break;
case GL_TEXTURE_1D:
- GL_EXTCALL(glTexStorage1D(texture->target, texture->level_count, gl_internal_format, width));
+ GL_EXTCALL(glTexStorage1D(texture_gl->target, texture_gl->t.level_count, gl_internal_format, width));
break;
default:
- GL_EXTCALL(glTexStorage2D(texture->target, texture->level_count,
+ GL_EXTCALL(glTexStorage2D(texture_gl->target, texture_gl->t.level_count,
gl_internal_format, width, height));
break;
}
@@ -978,7 +978,7 @@ void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl,
texture_gl->t.flags &= ~WINED3D_TEXTURE_IS_SRGB;
gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
- target = texture_gl->t.target;
+ target = texture_gl->target;
if (gl_tex->name)
{
@@ -1112,7 +1112,7 @@ void wined3d_texture_gl_apply_sampler_desc(struct wined3d_texture_gl *texture_gl
const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- GLenum target = texture_gl->t.target;
+ GLenum target = texture_gl->target;
struct gl_texture *gl_tex;
DWORD state;
@@ -1645,9 +1645,9 @@ HRESULT CDECL wined3d_texture_update_desc(struct wined3d_texture *texture, UINT
sub_resource->locations = WINED3D_LOCATION_DISCARDED;
if (multisample_type && gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
- texture->target = GL_TEXTURE_2D_MULTISAMPLE;
+ wined3d_texture_gl(texture)->target = GL_TEXTURE_2D_MULTISAMPLE;
else
- texture->target = GL_TEXTURE_2D;
+ wined3d_texture_gl(texture)->target = GL_TEXTURE_2D;
if (((width & (width - 1)) || (height & (height - 1))) && !d3d_info->texture_npot
&& !d3d_info->texture_npot_conditional)
@@ -1794,9 +1794,9 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
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);
+ wined3d_texture_gl_allocate_immutable_storage(wined3d_texture_gl(texture), internal, gl_info);
else
- wined3d_texture_allocate_gl_mutable_storage(texture, internal, format_gl, gl_info);
+ wined3d_texture_gl_allocate_mutable_storage(wined3d_texture_gl(texture), internal, format_gl, gl_info);
texture->flags |= alloc_flag;
}
@@ -1959,7 +1959,7 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
update_h /= format->height_scale.denominator;
}
- target = wined3d_texture_get_sub_resource_target(texture, sub_resource_idx);
+ target = wined3d_texture_gl_get_sub_resource_target(wined3d_texture_gl(texture), sub_resource_idx);
level = sub_resource_idx % texture->level_count;
switch (target)
@@ -2183,7 +2183,7 @@ static void texture2d_download_data(struct wined3d_texture *texture, unsigned in
}
sub_resource = &texture->sub_resources[sub_resource_idx];
- target = wined3d_texture_get_sub_resource_target(texture, sub_resource_idx);
+ target = wined3d_texture_gl_get_sub_resource_target(wined3d_texture_gl(texture), sub_resource_idx);
level = sub_resource_idx % texture->level_count;
if (target == GL_TEXTURE_2D_ARRAY)
@@ -2398,7 +2398,7 @@ void wined3d_texture_download_data(struct wined3d_texture *texture, unsigned int
GLenum target;
format_gl = wined3d_format_gl(texture->resource.format);
- target = wined3d_texture_get_sub_resource_target(texture, sub_resource_idx);
+ target = wined3d_texture_gl_get_sub_resource_target(wined3d_texture_gl(texture), sub_resource_idx);
level = sub_resource_idx % texture->level_count;
if (texture->resource.type == WINED3D_RTYPE_TEXTURE_2D
@@ -3052,53 +3052,12 @@ static HRESULT wined3d_texture_init(struct wined3d_texture *texture, const struc
texture->flags |= WINED3D_TEXTURE_GENERATE_MIPMAPS;
}
- switch (desc->resource_type)
- {
- case WINED3D_RTYPE_TEXTURE_1D:
- if (layer_count > 1)
- texture->target = GL_TEXTURE_1D_ARRAY;
- else
- texture->target = GL_TEXTURE_1D;
- break;
-
- case WINED3D_RTYPE_TEXTURE_2D:
- if (desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP)
- {
- texture->target = GL_TEXTURE_CUBE_MAP_ARB;
- }
- else if (desc->multisample_type && gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
- {
- if (layer_count > 1)
- texture->target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
- else
- texture->target = GL_TEXTURE_2D_MULTISAMPLE;
- }
- else
- {
- if (layer_count > 1)
- texture->target = GL_TEXTURE_2D_ARRAY;
- else
- texture->target = GL_TEXTURE_2D;
- }
- break;
-
- case WINED3D_RTYPE_TEXTURE_3D:
- texture->target = GL_TEXTURE_3D;
- break;
-
- default:
- ERR("Invalid resource type %s.\n", debug_d3dresourcetype(desc->resource_type));
- wined3d_texture_cleanup_sync(texture);
- return WINED3DERR_INVALIDCALL;
- }
-
/* Precalculated scaling for 'faked' non power of two texture coords. */
if (texture->resource.gl_type == WINED3D_GL_RES_TYPE_TEX_RECT)
{
texture->pow2_matrix[0] = (float)desc->width;
texture->pow2_matrix[5] = (float)desc->height;
texture->flags &= ~(WINED3D_TEXTURE_POW2_MAT_IDENT | WINED3D_TEXTURE_NORMALIZED_COORDS);
- texture->target = GL_TEXTURE_RECTANGLE_ARB;
}
else if (texture->flags & WINED3D_TEXTURE_COND_NP2_EMULATED)
{
@@ -3594,7 +3553,9 @@ static HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, st
const struct wined3d_resource_desc *desc, unsigned int layer_count, unsigned int level_count,
DWORD flags, void *parent, const struct wined3d_parent_ops *parent_ops, void *sub_resources)
{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const struct wined3d_texture_ops *texture_ops;
+ HRESULT hr;
TRACE("texture_gl %p, device %p, desc %p, layer_count %u, level_count %u, "
"flags %#x, parent %p, parent_ops %p, sub_resources %p.\n",
@@ -3605,13 +3566,39 @@ static HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, st
{
case WINED3D_RTYPE_TEXTURE_1D:
texture_ops = &texture1d_ops;
+ if (layer_count > 1)
+ texture_gl->target = GL_TEXTURE_1D_ARRAY;
+ else
+ texture_gl->target = GL_TEXTURE_1D;
break;
+
case WINED3D_RTYPE_TEXTURE_2D:
texture_ops = &texture2d_ops;
+ if (desc->usage & WINED3DUSAGE_LEGACY_CUBEMAP)
+ {
+ texture_gl->target = GL_TEXTURE_CUBE_MAP_ARB;
+ }
+ else if (desc->multisample_type && gl_info->supported[ARB_TEXTURE_MULTISAMPLE])
+ {
+ if (layer_count > 1)
+ texture_gl->target = GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
+ else
+ texture_gl->target = GL_TEXTURE_2D_MULTISAMPLE;
+ }
+ else
+ {
+ if (layer_count > 1)
+ texture_gl->target = GL_TEXTURE_2D_ARRAY;
+ else
+ texture_gl->target = GL_TEXTURE_2D;
+ }
break;
+
case WINED3D_RTYPE_TEXTURE_3D:
texture_ops = &texture3d_ops;
+ texture_gl->target = GL_TEXTURE_3D;
break;
+
default:
ERR("Invalid resource type %s.\n", debug_d3dresourcetype(desc->resource_type));
return WINED3DERR_INVALIDCALL;
@@ -3619,8 +3606,14 @@ static HRESULT wined3d_texture_gl_init(struct wined3d_texture_gl *texture_gl, st
list_init(&texture_gl->renderbuffers);
- return wined3d_texture_init(&texture_gl->t, desc, layer_count, level_count,
- flags, device, parent, parent_ops, sub_resources, texture_ops);
+ if (FAILED(hr = wined3d_texture_init(&texture_gl->t, desc, layer_count, level_count,
+ flags, device, parent, parent_ops, sub_resources, texture_ops)))
+ return hr;
+
+ if (texture_gl->t.resource.gl_type == WINED3D_GL_RES_TYPE_TEX_RECT)
+ texture_gl->target = GL_TEXTURE_RECTANGLE_ARB;
+
+ return WINED3D_OK;
}
HRESULT CDECL wined3d_texture_create(struct wined3d_device *device, const struct wined3d_resource_desc *desc,
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index 6e60c5ae3db..0bc4a37df45 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -5767,7 +5767,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
for (i = 0; i < d3d_info->limits.ffp_blend_stages; ++i)
{
- const struct wined3d_texture *texture;
+ struct wined3d_texture *texture;
settings->op[i].padding = 0;
if (state->texture_states[i][WINED3D_TSS_COLOR_OP] == WINED3D_TOP_DISABLE)
@@ -5796,7 +5796,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
}
else
{
- switch (texture->target)
+ switch (wined3d_texture_gl(texture)->target)
{
case GL_TEXTURE_1D:
settings->op[i].tex_type = WINED3D_GL_RES_TYPE_TEX_1D;
@@ -5857,7 +5857,7 @@ void gen_ffp_frag_op(const struct wined3d_context *context, const struct wined3d
GLenum texture_dimensions;
texture = state->textures[0];
- texture_dimensions = texture->target;
+ texture_dimensions = wined3d_texture_gl(texture)->target;
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
@@ -6063,11 +6063,11 @@ void add_ffp_frag_shader(struct wine_rb_tree *shaders, struct ffp_frag_desc *des
* not care for the colorop or correct gl texture unit (when using nvrc).
* Requires the caller to activate the correct unit. */
/* Context activation is done by the caller (state handler). */
-void texture_activate_dimensions(const struct wined3d_texture *texture, const struct wined3d_gl_info *gl_info)
+void texture_activate_dimensions(struct wined3d_texture *texture, const struct wined3d_gl_info *gl_info)
{
if (texture)
{
- switch (texture->target)
+ switch (wined3d_texture_gl(texture)->target)
{
case GL_TEXTURE_2D:
gl_info->gl_ops.gl.p_glDisable(GL_TEXTURE_3D);
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 3b579a25f0f..004611eb2c7 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -33,7 +33,7 @@ static BOOL is_stencil_view_format(const struct wined3d_format *format)
}
static GLenum get_texture_view_target(const struct wined3d_gl_info *gl_info,
- const struct wined3d_view_desc *desc, const struct wined3d_texture *texture)
+ const struct wined3d_view_desc *desc, const struct wined3d_texture_gl *texture_gl)
{
static const struct
{
@@ -69,7 +69,7 @@ static GLenum get_texture_view_target(const struct wined3d_gl_info *gl_info,
for (i = 0; i < ARRAY_SIZE(view_types); ++i)
{
- if (view_types[i].texture_target != texture->target || view_types[i].view_flags != desc->flags)
+ if (view_types[i].texture_target != texture_gl->target || view_types[i].view_flags != desc->flags)
continue;
if (gl_info->supported[view_types[i].extension])
return view_types[i].view_target;
@@ -77,8 +77,8 @@ static GLenum get_texture_view_target(const struct wined3d_gl_info *gl_info,
FIXME("Extension %#x not supported.\n", view_types[i].extension);
}
- FIXME("Unhandled view flags %#x for texture target %#x.\n", desc->flags, texture->target);
- return texture->target;
+ FIXME("Unhandled view flags %#x for texture target %#x.\n", desc->flags, texture_gl->target);
+ return texture_gl->target;
}
static const struct wined3d_format *validate_resource_view(const struct wined3d_view_desc *desc,
@@ -564,7 +564,7 @@ static void wined3d_render_target_view_cs_init(void *object)
return;
}
- create_texture_view(&view->gl_view, texture_gl->t.target, desc, texture_gl, view->format);
+ create_texture_view(&view->gl_view, texture_gl->target, desc, texture_gl, view->format);
}
}
}
@@ -747,9 +747,9 @@ static void wined3d_shader_resource_view_cs_init(void *object)
resource_class = wined3d_format_gl(resource->format)->view_class;
view_class = wined3d_format_gl(view_format)->view_class;
- view_target = get_texture_view_target(gl_info, desc, &texture_gl->t);
+ view_target = get_texture_view_target(gl_info, desc, texture_gl);
- if (resource->format->id == view_format->id && texture_gl->t.target == view_target
+ if (resource->format->id == view_format->id && texture_gl->target == view_target
&& !desc->u.texture.level_idx && desc->u.texture.level_count == texture_gl->t.level_count
&& !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture_gl->t.layer_count
&& !is_stencil_view_format(view_format))
@@ -898,8 +898,8 @@ void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *
else
{
wined3d_texture_gl_bind_and_dirtify(texture_gl, context, srgb);
- gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_BASE_LEVEL, base_level);
- gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_MAX_LEVEL, max_level);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target, GL_TEXTURE_BASE_LEVEL, base_level);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target, GL_TEXTURE_MAX_LEVEL, max_level);
}
if (gl_info->supported[ARB_SAMPLER_OBJECTS])
@@ -907,12 +907,12 @@ void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *
gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
if (context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
{
- gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_SRGB_DECODE_EXT,
- GL_SKIP_DECODE_EXT);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target,
+ GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
gl_tex->sampler_desc.srgb_decode = FALSE;
}
- gl_info->fbo_ops.glGenerateMipmap(texture_gl->t.target);
+ gl_info->fbo_ops.glGenerateMipmap(texture_gl->target);
checkGLcall("glGenerateMipMap()");
for (i = 0; i < layer_count; ++i)
@@ -927,7 +927,7 @@ void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *
if (!view->gl_view.name)
{
gl_tex->base_level = base_level;
- gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target,
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->target,
GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
}
@@ -1141,7 +1141,7 @@ static void wined3d_unordered_access_view_cs_init(void *object)
if (desc->u.texture.layer_idx || desc->u.texture.layer_count != depth_or_layer_count)
{
- create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, &texture_gl->t),
+ create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, texture_gl),
desc, texture_gl, view->format);
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 861c6475420..84bf14d51f4 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -3217,7 +3217,6 @@ struct wined3d_texture
UINT lod;
DWORD sampler;
DWORD flags;
- GLenum target;
DWORD update_map_binding;
void *user_memory;
@@ -3273,23 +3272,6 @@ static inline struct wined3d_texture *texture_from_resource(struct wined3d_resou
return CONTAINING_RECORD(resource, struct wined3d_texture, resource);
}
-static inline GLenum wined3d_texture_get_sub_resource_target(const struct wined3d_texture *texture,
- unsigned int sub_resource_idx)
-{
- static const GLenum cube_targets[] =
- {
- GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
- GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
- GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
- };
-
- return texture->resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP
- ? cube_targets[sub_resource_idx / texture->level_count] : texture->target;
-}
-
static inline unsigned int wined3d_texture_get_level_width(const struct wined3d_texture *texture,
unsigned int level)
{
@@ -3333,11 +3315,11 @@ HRESULT texture2d_blt(struct wined3d_texture *dst_texture, unsigned int dst_sub_
const struct wined3d_box *dst_box, struct wined3d_texture *src_texture,
unsigned int src_sub_resource_idx, const struct wined3d_box *src_box, DWORD flags,
const struct wined3d_blt_fx *blt_fx, enum wined3d_texture_filter_type filter) DECLSPEC_HIDDEN;
-void texture2d_get_blt_info(const struct wined3d_texture *texture, unsigned int sub_resource_idx,
+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) DECLSPEC_HIDDEN;
BOOL texture2d_load_drawable(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context) DECLSPEC_HIDDEN;
-void texture2d_load_fb_texture(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+void texture2d_load_fb_texture(struct wined3d_texture_gl *texture_gl, unsigned int sub_resource_idx,
BOOL srgb, struct wined3d_context *context) DECLSPEC_HIDDEN;
BOOL texture2d_load_renderbuffer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, DWORD dst_location) DECLSPEC_HIDDEN;
@@ -3395,6 +3377,8 @@ struct wined3d_texture_gl
struct gl_texture texture_rgb, texture_srgb;
+ GLenum target;
+
GLuint rb_multisample;
GLuint rb_resolved;
@@ -3413,6 +3397,23 @@ static inline struct gl_texture *wined3d_texture_gl_get_gl_texture(struct wined3
return srgb ? &texture_gl->texture_srgb : &texture_gl->texture_rgb;
}
+static inline GLenum wined3d_texture_gl_get_sub_resource_target(const struct wined3d_texture_gl *texture_gl,
+ unsigned int sub_resource_idx)
+{
+ static const GLenum cube_targets[] =
+ {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
+ };
+
+ return texture_gl->t.resource.usage & WINED3DUSAGE_LEGACY_CUBEMAP
+ ? cube_targets[sub_resource_idx / texture_gl->t.level_count] : texture_gl->target;
+}
+
void wined3d_texture_gl_apply_sampler_desc(struct wined3d_texture_gl *texture_gl,
const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context) DECLSPEC_HIDDEN;
void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl,
@@ -3986,7 +3987,7 @@ BOOL is_invalid_op(const struct wined3d_state *state, int stage,
void set_tex_op_nvrc(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state,
BOOL is_alpha, int stage, enum wined3d_texture_op op, DWORD arg1, DWORD arg2, DWORD arg3,
INT texture_idx, DWORD dst) DECLSPEC_HIDDEN;
-void texture_activate_dimensions(const struct wined3d_texture *texture,
+void texture_activate_dimensions(struct wined3d_texture *texture,
const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
void sampler_texdim(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
--
2.11.0
2
1
[PATCH 1/5] wined3d: Move the OpenGL textures from struct wined3d_texture to struct wined3d_texture_gl.
by Henri Verbeet 30 Oct '18
by Henri Verbeet 30 Oct '18
30 Oct '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/wined3d/arb_program_shader.c | 3 +-
dlls/wined3d/context.c | 48 ++++++++---------
dlls/wined3d/cs.c | 4 +-
dlls/wined3d/glsl_shader.c | 3 +-
dlls/wined3d/sampler.c | 22 ++++----
dlls/wined3d/state.c | 10 ++--
dlls/wined3d/surface.c | 93 +++++++++++++++++----------------
dlls/wined3d/swapchain.c | 6 +--
dlls/wined3d/texture.c | 106 +++++++++++++++++++-------------------
dlls/wined3d/view.c | 80 ++++++++++++++--------------
dlls/wined3d/wined3d_private.h | 67 ++++++++++++------------
11 files changed, 227 insertions(+), 215 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 67fd193a7bb..24f7e045fc5 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -7904,7 +7904,8 @@ static DWORD arbfp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bl
arbfp_blit_set(arbfp_blitter, context, src_texture, src_sub_resource_idx, color_key);
/* Draw a textured quad */
- context_draw_textured_quad(context, src_texture, src_sub_resource_idx, src_rect, dst_rect, filter);
+ context_draw_textured_quad(context, wined3d_texture_gl(src_texture),
+ src_sub_resource_idx, src_rect, dst_rect, filter);
/* Leave the opengl state valid for blitting */
arbfp_blit_unset(context->gl_info);
diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index 9027e94ed09..fbe3d941de8 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -472,11 +472,11 @@ static inline void context_set_fbo_key_for_render_target(const struct wined3d_co
switch (location)
{
case WINED3D_LOCATION_TEXTURE_RGB:
- key->objects[idx].object = wined3d_texture_get_texture_name(&texture_gl->t, context, FALSE);
+ key->objects[idx].object = wined3d_texture_gl_get_texture_name(texture_gl, context, FALSE);
break;
case WINED3D_LOCATION_TEXTURE_SRGB:
- key->objects[idx].object = wined3d_texture_get_texture_name(&texture_gl->t, context, TRUE);
+ key->objects[idx].object = wined3d_texture_gl_get_texture_name(texture_gl, context, TRUE);
break;
case WINED3D_LOCATION_RB_MULTISAMPLE:
@@ -1089,7 +1089,7 @@ void context_gl_resource_released(struct wined3d_device *device,
context_enum_fbo_entries(device, name, rb_namespace, context_queue_fbo_entry_destruction);
}
-void context_texture_update(struct wined3d_context *context, const struct wined3d_texture *texture)
+void context_texture_update(struct wined3d_context *context, const struct wined3d_texture_gl *texture_gl)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry = context->current_fbo;
@@ -1099,10 +1099,10 @@ void context_texture_update(struct wined3d_context *context, const struct wined3
for (i = 0; i < gl_info->limits.buffers + 1; ++i)
{
- if (texture->texture_rgb.name == entry->key.objects[i].object
- || texture->texture_srgb.name == entry->key.objects[i].object)
+ if (texture_gl->texture_rgb.name == entry->key.objects[i].object
+ || texture_gl->texture_srgb.name == entry->key.objects[i].object)
{
- TRACE("Updated texture %p is bound as attachment %u to the current FBO.\n", texture, i);
+ TRACE("Updated texture %p is bound as attachment %u to the current FBO.\n", texture_gl, i);
context->rebind_fbo = TRUE;
return;
}
@@ -3896,8 +3896,8 @@ static void context_bind_unordered_access_views(struct wined3d_context *context,
}
else if (view->resource->type != WINED3D_RTYPE_BUFFER)
{
- struct wined3d_texture *texture = texture_from_resource(view->resource);
- texture_name = wined3d_texture_get_texture_name(texture, context, FALSE);
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(view->resource));
+ texture_name = wined3d_texture_gl_get_texture_name(texture_gl, context, FALSE);
level = view->desc.u.texture.level_idx;
}
else
@@ -4195,14 +4195,14 @@ static void context_setup_target(struct wined3d_context *context,
&& old_render_offscreen && (context->current_rt.texture != texture
|| context->current_rt.sub_resource_idx != sub_resource_idx))
{
+ struct wined3d_texture_gl *prev_texture = wined3d_texture_gl(context->current_rt.texture);
unsigned int prev_sub_resource_idx = context->current_rt.sub_resource_idx;
- struct wined3d_texture *prev_texture = context->current_rt.texture;
/* Read the back buffer of the old drawable into the destination texture. */
if (prev_texture->texture_srgb.name)
- wined3d_texture_load(prev_texture, context, TRUE);
- wined3d_texture_load(prev_texture, context, FALSE);
- wined3d_texture_invalidate_location(prev_texture, prev_sub_resource_idx, WINED3D_LOCATION_DRAWABLE);
+ wined3d_texture_load(&prev_texture->t, context, TRUE);
+ wined3d_texture_load(&prev_texture->t, context, FALSE);
+ wined3d_texture_invalidate_location(&prev_texture->t, prev_sub_resource_idx, WINED3D_LOCATION_DRAWABLE);
}
}
@@ -5581,7 +5581,7 @@ static void apply_texture_blit_state(const struct wined3d_gl_info *gl_info, stru
}
/* Context activation is done by the caller. */
-void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_texture *texture,
+void context_draw_shaded_quad(struct wined3d_context *context, 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)
{
@@ -5596,11 +5596,11 @@ void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_te
}
quad[4];
- texture2d_get_blt_info(texture, sub_resource_idx, src_rect, &info);
+ texture2d_get_blt_info(&texture_gl->t, sub_resource_idx, src_rect, &info);
- level = sub_resource_idx % texture->level_count;
- context_bind_texture(context, info.bind_target, texture->texture_rgb.name);
- apply_texture_blit_state(gl_info, &texture->texture_rgb, info.bind_target, level, filter);
+ level = sub_resource_idx % texture_gl->t.level_count;
+ context_bind_texture(context, info.bind_target, texture_gl->texture_rgb.name);
+ apply_texture_blit_state(gl_info, &texture_gl->texture_rgb, info.bind_target, level, filter);
gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, level);
context_get_rt_size(context, &dst_size);
@@ -5661,12 +5661,12 @@ void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_te
}
checkGLcall("draw");
- gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, texture->level_count - 1);
+ gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
context_bind_texture(context, info.bind_target, 0);
}
/* Context activation is done by the caller. */
-void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_texture *texture,
+void context_draw_textured_quad(struct wined3d_context *context, 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)
{
@@ -5674,14 +5674,14 @@ void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_
struct wined3d_blt_info info;
unsigned int level;
- texture2d_get_blt_info(texture, sub_resource_idx, src_rect, &info);
+ texture2d_get_blt_info(&texture_gl->t, sub_resource_idx, src_rect, &info);
gl_info->gl_ops.gl.p_glEnable(info.bind_target);
checkGLcall("glEnable(bind_target)");
- level = sub_resource_idx % texture->level_count;
- context_bind_texture(context, info.bind_target, texture->texture_rgb.name);
- apply_texture_blit_state(gl_info, &texture->texture_rgb, info.bind_target, level, filter);
+ level = sub_resource_idx % texture_gl->t.level_count;
+ context_bind_texture(context, info.bind_target, texture_gl->texture_rgb.name);
+ apply_texture_blit_state(gl_info, &texture_gl->texture_rgb, info.bind_target, level, filter);
gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, level);
gl_info->gl_ops.gl.p_glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
checkGLcall("glTexEnvi");
@@ -5701,6 +5701,6 @@ void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_
gl_info->gl_ops.gl.p_glVertex2i(dst_rect->right, dst_rect->bottom);
gl_info->gl_ops.gl.p_glEnd();
- gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, texture->level_count - 1);
+ gl_info->gl_ops.gl.p_glTexParameteri(info.bind_target, GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
context_bind_texture(context, info.bind_target, 0);
}
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index fc3e47e3298..9114f0344ab 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -2227,7 +2227,7 @@ static void wined3d_cs_exec_blt_sub_resource(struct wined3d_cs *cs, const void *
wined3d_texture_get_pitch(src_texture, op->src_sub_resource_idx % src_texture->level_count,
&row_pitch, &slice_pitch);
- wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(dst_texture), context, FALSE);
wined3d_texture_upload_data(dst_texture, op->dst_sub_resource_idx, context,
dst_texture->resource.format, &op->src_box, wined3d_const_bo_address(&addr),
row_pitch, slice_pitch, op->dst_box.left, op->dst_box.top, op->dst_box.front, FALSE);
@@ -2325,7 +2325,7 @@ static void wined3d_cs_exec_update_sub_resource(struct wined3d_cs *cs, const voi
wined3d_texture_prepare_texture(texture, context, FALSE);
else
wined3d_texture_load_location(texture, op->sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB);
- wined3d_texture_bind_and_dirtify(texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, FALSE);
wined3d_box_set(&src_box, 0, 0, box->right - box->left, box->bottom - box->top, 0, box->back - box->front);
wined3d_texture_upload_data(texture, op->sub_resource_idx, context, texture->resource.format, &src_box,
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 32f82d6c3d0..fc9730f64b9 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -13310,7 +13310,8 @@ static DWORD glsl_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_bli
default:
break;
}
- context_draw_shaded_quad(context, src_texture, src_sub_resource_idx, src_rect, dst_rect, filter);
+ context_draw_shaded_quad(context, wined3d_texture_gl(src_texture),
+ src_sub_resource_idx, src_rect, dst_rect, filter);
GL_EXTCALL(glUseProgram(0));
if (dst_texture->swapchain && (dst_texture->swapchain->front_buffer == dst_texture))
diff --git a/dlls/wined3d/sampler.c b/dlls/wined3d/sampler.c
index 82fbe2c3be7..458a330774f 100644
--- a/dlls/wined3d/sampler.c
+++ b/dlls/wined3d/sampler.c
@@ -155,34 +155,34 @@ HRESULT CDECL wined3d_sampler_create(struct wined3d_device *device, const struct
return WINED3D_OK;
}
-static void texture_apply_base_level(struct wined3d_texture *texture,
+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)
{
struct gl_texture *gl_tex;
unsigned int base_level;
- if (texture->flags & WINED3D_TEXTURE_COND_NP2)
+ if (texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2)
base_level = 0;
else if (desc->mip_filter == WINED3D_TEXF_NONE)
- base_level = texture->lod;
+ base_level = texture_gl->t.lod;
else
- base_level = min(max(desc->mip_base_level, texture->lod), texture->level_count - 1);
+ base_level = min(max(desc->mip_base_level, texture_gl->t.lod), texture_gl->t.level_count - 1);
- gl_tex = wined3d_texture_get_gl_texture(texture, texture->flags & WINED3D_TEXTURE_IS_SRGB);
+ gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, texture_gl->t.flags & WINED3D_TEXTURE_IS_SRGB);
if (base_level != gl_tex->base_level)
{
/* Note that WINED3D_SAMP_MAX_MIP_LEVEL specifies the largest mipmap
* (default 0), while GL_TEXTURE_MAX_LEVEL specifies the smallest
* mipmap used (default 1000). So WINED3D_SAMP_MAX_MIP_LEVEL
* corresponds to GL_TEXTURE_BASE_LEVEL. */
- gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, base_level);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_BASE_LEVEL, base_level);
gl_tex->base_level = base_level;
}
}
/* This function relies on the correct texture being bound and loaded. */
void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit,
- struct wined3d_texture *texture, const struct wined3d_context *context)
+ struct wined3d_texture_gl *texture_gl, const struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -191,15 +191,15 @@ void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit,
GL_EXTCALL(glBindSampler(unit, sampler->name));
checkGLcall("bind sampler");
}
- else if (texture)
+ else if (texture_gl)
{
- wined3d_texture_apply_sampler_desc(texture, &sampler->desc, context);
+ wined3d_texture_gl_apply_sampler_desc(texture_gl, &sampler->desc, context);
}
else
{
ERR("Could not apply sampler state.\n");
}
- if (texture)
- texture_apply_base_level(texture, &sampler->desc, gl_info);
+ if (texture_gl)
+ texture_gl_apply_base_level(texture_gl, &sampler->desc, gl_info);
}
diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c
index ab67c578901..7f3961b7465 100644
--- a/dlls/wined3d/state.c
+++ b/dlls/wined3d/state.c
@@ -3612,17 +3612,17 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
if (state->textures[sampler_idx])
{
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(state->textures[sampler_idx]);
BOOL srgb = state->sampler_states[sampler_idx][WINED3D_SAMP_SRGB_TEXTURE];
const DWORD *sampler_states = state->sampler_states[sampler_idx];
- struct wined3d_texture *texture = state->textures[sampler_idx];
struct wined3d_device *device = context->device;
struct wined3d_sampler_desc desc;
struct wined3d_sampler *sampler;
struct wine_rb_entry *entry;
- wined3d_sampler_desc_from_sampler_states(&desc, context, sampler_states, texture);
+ wined3d_sampler_desc_from_sampler_states(&desc, context, sampler_states, &texture_gl->t);
- wined3d_texture_bind(texture, context, srgb);
+ wined3d_texture_gl_bind(texture_gl, context, srgb);
if ((entry = wine_rb_get(&device->samplers, &desc)))
{
@@ -3643,10 +3643,10 @@ static void sampler(struct wined3d_context *context, const struct wined3d_state
}
}
- wined3d_sampler_bind(sampler, mapped_stage, texture, context);
+ wined3d_sampler_bind(sampler, mapped_stage, texture_gl, context);
/* Trigger shader constant reloading (for NP2 texcoord fixup) */
- if (!(texture->flags & WINED3D_TEXTURE_POW2_MAT_IDENT))
+ if (!(texture_gl->t.flags & WINED3D_TEXTURE_POW2_MAT_IDENT))
context->constant_update_mask |= WINED3D_SHADER_CONST_PS_NP2_FIXUP;
}
else
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 746599e58f5..02cd2c376c1 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -687,7 +687,7 @@ static struct wined3d_texture *surface_convert_format(struct wined3d_texture *sr
TRACE("Using upload conversion.\n");
wined3d_texture_prepare_texture(dst_texture, context, FALSE);
- wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(dst_texture), context, FALSE);
wined3d_texture_upload_data(dst_texture, 0, context, src_format, &src_box,
wined3d_const_bo_address(&src_data), src_row_pitch, src_slice_pitch, 0, 0, 0, FALSE);
@@ -855,7 +855,7 @@ void texture2d_load_fb_texture(struct wined3d_texture *texture,
device_invalidate_state(device, STATE_FRAMEBUFFER);
wined3d_texture_prepare_texture(texture, context, srgb);
- wined3d_texture_bind_and_dirtify(texture, context, srgb);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, srgb);
TRACE("Reading back offscreen render target %p, %u.\n", texture, sub_resource_idx);
@@ -878,11 +878,11 @@ void texture2d_load_fb_texture(struct wined3d_texture *texture,
/* Does a direct frame buffer -> texture copy. Stretching is done with single
* pixel copy calls. */
-static void fb_copy_to_texture_direct(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
- const RECT *dst_rect_in, struct wined3d_texture *src_texture, unsigned int src_sub_resource_idx,
+static void fb_copy_to_texture_direct(struct wined3d_texture_gl *dst_texture, unsigned int dst_sub_resource_idx,
+ const RECT *dst_rect_in, struct wined3d_texture_gl *src_texture, unsigned int src_sub_resource_idx,
const RECT *src_rect, enum wined3d_texture_filter_type filter)
{
- struct wined3d_device *device = dst_texture->resource.device;
+ struct wined3d_device *device = dst_texture->t.resource.device;
unsigned int src_height, src_level, dst_level;
const struct wined3d_gl_info *gl_info;
float xrel, yrel;
@@ -901,14 +901,14 @@ static void fb_copy_to_texture_direct(struct wined3d_texture *dst_texture, unsig
upsidedown = TRUE;
}
- context = context_acquire(device, src_texture, src_sub_resource_idx);
+ context = context_acquire(device, &src_texture->t, src_sub_resource_idx);
gl_info = context->gl_info;
context_apply_blit_state(context, device);
- wined3d_texture_load(dst_texture, context, FALSE);
+ wined3d_texture_load(&dst_texture->t, context, FALSE);
/* Bind the target texture */
- context_bind_texture(context, dst_texture->target, dst_texture->texture_rgb.name);
- if (wined3d_resource_is_offscreen(&src_texture->resource))
+ context_bind_texture(context, dst_texture->t.target, dst_texture->texture_rgb.name);
+ if (wined3d_resource_is_offscreen(&src_texture->t.resource))
{
TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown;
@@ -916,7 +916,7 @@ static void fb_copy_to_texture_direct(struct wined3d_texture *dst_texture, unsig
}
else
{
- gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(src_texture));
+ gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(&src_texture->t));
}
checkGLcall("glReadBuffer");
@@ -936,11 +936,11 @@ static void fb_copy_to_texture_direct(struct wined3d_texture *dst_texture, unsig
ERR("Texture filtering not supported in direct blit\n");
}
- src_level = src_sub_resource_idx % src_texture->level_count;
- dst_level = dst_sub_resource_idx % dst_texture->level_count;
+ src_level = src_sub_resource_idx % src_texture->t.level_count;
+ dst_level = dst_sub_resource_idx % dst_texture->t.level_count;
- src_height = wined3d_texture_get_level_height(src_texture, src_level);
- dst_target = wined3d_texture_get_sub_resource_target(dst_texture, dst_sub_resource_idx);
+ src_height = wined3d_texture_get_level_height(&src_texture->t, src_level);
+ dst_target = wined3d_texture_get_sub_resource_target(&dst_texture->t, dst_sub_resource_idx);
if (upsidedown
&& !((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
&& !((yrel - 1.0f < -eps) || (yrel - 1.0f > eps)))
@@ -990,17 +990,17 @@ static void fb_copy_to_texture_direct(struct wined3d_texture *dst_texture, unsig
/* The texture is now most up to date - If the surface is a render target
* and has a drawable, this path is never entered. */
- wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
- wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
+ wined3d_texture_validate_location(&dst_texture->t, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
+ wined3d_texture_invalidate_location(&dst_texture->t, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
}
/* Uses the hardware to stretch and flip the image */
-static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
- const RECT *dst_rect_in, struct wined3d_texture *src_texture, unsigned int src_sub_resource_idx,
+static void fb_copy_to_texture_hwstretch(struct wined3d_texture_gl *dst_texture, unsigned int dst_sub_resource_idx,
+ const RECT *dst_rect_in, struct wined3d_texture_gl *src_texture, unsigned int src_sub_resource_idx,
const RECT *src_rect, enum wined3d_texture_filter_type filter)
{
unsigned int src_width, src_height, src_pow2_width, src_pow2_height, src_level;
- struct wined3d_device *device = dst_texture->resource.device;
+ struct wined3d_device *device = dst_texture->t.resource.device;
GLenum src_target, dst_target, texture_target;
GLuint src, backup = 0;
float left, right, top, bottom; /* Texture coordinates */
@@ -1015,28 +1015,28 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
TRACE("Using hwstretch blit\n");
- src_target = wined3d_texture_get_sub_resource_target(src_texture, src_sub_resource_idx);
- dst_target = wined3d_texture_get_sub_resource_target(dst_texture, dst_sub_resource_idx);
+ src_target = wined3d_texture_get_sub_resource_target(&src_texture->t, src_sub_resource_idx);
+ dst_target = wined3d_texture_get_sub_resource_target(&dst_texture->t, dst_sub_resource_idx);
/* Activate the Proper context for reading from the source surface, set it up for blitting */
- context = context_acquire(device, src_texture, src_sub_resource_idx);
+ context = context_acquire(device, &src_texture->t, src_sub_resource_idx);
gl_info = context->gl_info;
context_apply_ffp_blit_state(context, device);
- wined3d_texture_load(dst_texture, context, FALSE);
+ wined3d_texture_load(&dst_texture->t, context, FALSE);
offscreen_buffer = context_get_offscreen_gl_buffer(context);
- src_level = src_sub_resource_idx % src_texture->level_count;
- src_width = wined3d_texture_get_level_width(src_texture, src_level);
- src_height = wined3d_texture_get_level_height(src_texture, src_level);
- src_pow2_width = wined3d_texture_get_level_pow2_width(src_texture, src_level);
- src_pow2_height = wined3d_texture_get_level_pow2_height(src_texture, src_level);
+ src_level = src_sub_resource_idx % src_texture->t.level_count;
+ src_width = wined3d_texture_get_level_width(&src_texture->t, src_level);
+ src_height = wined3d_texture_get_level_height(&src_texture->t, src_level);
+ src_pow2_width = wined3d_texture_get_level_pow2_width(&src_texture->t, src_level);
+ src_pow2_height = wined3d_texture_get_level_pow2_height(&src_texture->t, src_level);
- src_offscreen = wined3d_resource_is_offscreen(&src_texture->resource);
+ src_offscreen = wined3d_resource_is_offscreen(&src_texture->t.resource);
noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
if (!noBackBufferBackup && !src_texture->texture_rgb.name)
{
/* Get it a description */
- wined3d_texture_load(src_texture, context, FALSE);
+ wined3d_texture_load(&src_texture->t, context, FALSE);
}
/* Try to use an aux buffer for drawing the rectangle. This way it doesn't need restoring.
@@ -1071,7 +1071,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
checkGLcall("glEnable(texture_target)");
/* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */
- src_texture->sub_resources[src_sub_resource_idx].locations &= ~WINED3D_LOCATION_TEXTURE_RGB;
+ src_texture->t.sub_resources[src_sub_resource_idx].locations &= ~WINED3D_LOCATION_TEXTURE_RGB;
}
/* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
@@ -1092,7 +1092,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
}
else
{
- gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(src_texture));
+ gl_info->gl_ops.gl.p_glReadBuffer(wined3d_texture_get_gl_buffer(&src_texture->t));
}
/* TODO: Only back up the part that will be overwritten */
@@ -1107,7 +1107,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
wined3d_gl_min_mip_filter(filter, WINED3D_TEXF_NONE));
checkGLcall("glTexParameteri");
- if (!src_texture->swapchain || src_texture == src_texture->swapchain->back_buffers[0])
+ if (!src_texture->t.swapchain || &src_texture->t == src_texture->t.swapchain->back_buffers[0])
{
src = backup ? backup : src_texture->texture_rgb.name;
}
@@ -1159,7 +1159,7 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
bottom = src_height - src_rect->top;
}
- if (src_texture->flags & WINED3D_TEXTURE_NORMALIZED_COORDS)
+ if (src_texture->t.flags & WINED3D_TEXTURE_NORMALIZED_COORDS)
{
left /= src_pow2_width;
right /= src_pow2_width;
@@ -1271,8 +1271,8 @@ static void fb_copy_to_texture_hwstretch(struct wined3d_texture *dst_texture, un
/* The texture is now most up to date - If the surface is a render target
* and has a drawable, this path is never entered. */
- wined3d_texture_validate_location(dst_texture, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
- wined3d_texture_invalidate_location(dst_texture, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
+ wined3d_texture_validate_location(&dst_texture->t, dst_sub_resource_idx, WINED3D_LOCATION_TEXTURE_RGB);
+ wined3d_texture_invalidate_location(&dst_texture->t, dst_sub_resource_idx, ~WINED3D_LOCATION_TEXTURE_RGB);
}
static HRESULT wined3d_texture_blt_special(struct wined3d_texture *dst_texture, unsigned int dst_sub_resource_idx,
@@ -1395,14 +1395,14 @@ static HRESULT wined3d_texture_blt_special(struct wined3d_texture *dst_texture,
|| dst_rect->bottom - dst_rect->top > src_height)
{
TRACE("No stretching in x direction, using direct framebuffer -> texture copy.\n");
- fb_copy_to_texture_direct(dst_texture, dst_sub_resource_idx, dst_rect,
- src_texture, src_sub_resource_idx, src_rect, filter);
+ fb_copy_to_texture_direct(wined3d_texture_gl(dst_texture), dst_sub_resource_idx, dst_rect,
+ wined3d_texture_gl(src_texture), src_sub_resource_idx, src_rect, filter);
}
else
{
TRACE("Using hardware stretching to flip / stretch the texture.\n");
- fb_copy_to_texture_hwstretch(dst_texture, dst_sub_resource_idx, dst_rect,
- src_texture, src_sub_resource_idx, src_rect, filter);
+ fb_copy_to_texture_hwstretch(wined3d_texture_gl(dst_texture), dst_sub_resource_idx, dst_rect,
+ wined3d_texture_gl(src_texture), src_sub_resource_idx, src_rect, filter);
}
return WINED3D_OK;
@@ -1438,7 +1438,7 @@ BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_res
if (sub_resource->locations & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB))
{
struct wined3d_bo_address data;
- wined3d_texture_bind_and_dirtify(texture, context,
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context,
!(sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB));
wined3d_texture_get_memory(texture, sub_resource_idx, &data, dst_location);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
@@ -1605,7 +1605,7 @@ BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_re
}
wined3d_texture_prepare_texture(texture, context, srgb);
- wined3d_texture_bind_and_dirtify(texture, context, srgb);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, srgb);
wined3d_texture_get_pitch(texture, level, &src_row_pitch, &src_slice_pitch);
format = texture->resource.format;
@@ -1879,7 +1879,8 @@ static DWORD raw_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB;
if (!wined3d_texture_load_location(src_texture, src_sub_resource_idx, context, location))
ERR("Failed to load the source sub-resource into %s.\n", wined3d_debug_location(location));
- src_name = wined3d_texture_get_texture_name(src_texture, context, location == WINED3D_LOCATION_TEXTURE_SRGB);
+ src_name = wined3d_texture_gl_get_texture_name(wined3d_texture_gl(src_texture),
+ context, location == WINED3D_LOCATION_TEXTURE_SRGB);
location = dst_location & (WINED3D_LOCATION_TEXTURE_RGB | WINED3D_LOCATION_TEXTURE_SRGB);
if (!location)
@@ -1895,7 +1896,8 @@ static DWORD raw_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
if (!wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, location))
ERR("Failed to load the destination sub-resource into %s.\n", wined3d_debug_location(location));
}
- dst_name = wined3d_texture_get_texture_name(dst_texture, context, location == WINED3D_LOCATION_TEXTURE_SRGB);
+ dst_name = wined3d_texture_gl_get_texture_name(wined3d_texture_gl(dst_texture),
+ context, location == WINED3D_LOCATION_TEXTURE_SRGB);
GL_EXTCALL(glCopyImageSubData(src_name, src_texture->target, src_level,
src_rect->left, src_rect->top, src_layer, dst_name, dst_texture->target, dst_level,
@@ -2218,7 +2220,8 @@ static DWORD ffp_blitter_blit(struct wined3d_blitter *blitter, enum wined3d_blit
checkGLcall("glAlphaFunc");
}
- context_draw_textured_quad(context, src_texture, src_sub_resource_idx, src_rect, dst_rect, filter);
+ context_draw_textured_quad(context, wined3d_texture_gl(src_texture),
+ src_sub_resource_idx, src_rect, dst_rect, filter);
if (op == WINED3D_BLIT_OP_COLOR_BLIT_ALPHATEST || color_key)
{
diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index 1f0fd108362..8de88714d10 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -356,7 +356,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
texture_prev = wined3d_texture_gl(swapchain->back_buffers[0]);
/* Back buffer 0 is already in the draw binding. */
- tex0 = texture_prev->t.texture_rgb;
+ tex0 = texture_prev->texture_rgb;
rb0 = texture_prev->rb_multisample;
locations0 = texture_prev->t.sub_resources[0].locations;
@@ -368,7 +368,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
if (!(sub_resource->locations & supported_locations))
wined3d_texture_load_location(&texture->t, 0, context, texture->t.resource.draw_binding);
- texture_prev->t.texture_rgb = texture->t.texture_rgb;
+ texture_prev->texture_rgb = texture->texture_rgb;
texture_prev->rb_multisample = texture->rb_multisample;
wined3d_texture_validate_location(&texture_prev->t, 0, sub_resource->locations & supported_locations);
@@ -377,7 +377,7 @@ static void wined3d_swapchain_gl_rotate(struct wined3d_swapchain *swapchain, str
texture_prev = texture;
}
- texture_prev->t.texture_rgb = tex0;
+ texture_prev->texture_rgb = tex0;
texture_prev->rb_multisample = rb0;
wined3d_texture_validate_location(&texture_prev->t, 0, locations0 & supported_locations);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 42bae136a53..f1a2498f777 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -670,18 +670,18 @@ static void wined3d_texture_gl_unload_texture(struct wined3d_texture_gl *texture
const struct wined3d_gl_info *gl_info = NULL;
struct wined3d_context *context = NULL;
- if (texture_gl->t.texture_rgb.name || texture_gl->t.texture_srgb.name
+ if (texture_gl->texture_rgb.name || texture_gl->texture_srgb.name
|| texture_gl->rb_multisample || texture_gl->rb_resolved)
{
context = context_acquire(device, NULL, 0);
gl_info = context->gl_info;
}
- if (texture_gl->t.texture_rgb.name)
- gltexture_delete(device, context->gl_info, &texture_gl->t.texture_rgb);
+ if (texture_gl->texture_rgb.name)
+ gltexture_delete(device, context->gl_info, &texture_gl->texture_rgb);
- if (texture_gl->t.texture_srgb.name)
- gltexture_delete(device, context->gl_info, &texture_gl->t.texture_srgb);
+ if (texture_gl->texture_srgb.name)
+ gltexture_delete(device, context->gl_info, &texture_gl->texture_srgb);
if (texture_gl->rb_multisample)
{
@@ -957,28 +957,28 @@ void wined3d_gl_texture_swizzle_from_color_fixup(GLint swizzle[4], struct color_
}
/* Context activation is done by the caller. */
-void wined3d_texture_bind(struct wined3d_texture *texture,
+void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl,
struct wined3d_context *context, BOOL srgb)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
- const struct wined3d_format *format = texture->resource.format;
+ const struct wined3d_format *format = texture_gl->t.resource.format;
const struct color_fixup_desc fixup = format->color_fixup;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
struct gl_texture *gl_tex;
GLenum target;
- TRACE("texture %p, context %p, srgb %#x.\n", texture, context, srgb);
+ TRACE("texture_gl %p, context %p, srgb %#x.\n", texture_gl, context, srgb);
- if (!needs_separate_srgb_gl_texture(context, texture))
+ if (!needs_separate_srgb_gl_texture(context, &texture_gl->t))
srgb = FALSE;
/* sRGB mode cache for preload() calls outside drawprim. */
if (srgb)
- texture->flags |= WINED3D_TEXTURE_IS_SRGB;
+ texture_gl->t.flags |= WINED3D_TEXTURE_IS_SRGB;
else
- texture->flags &= ~WINED3D_TEXTURE_IS_SRGB;
+ texture_gl->t.flags &= ~WINED3D_TEXTURE_IS_SRGB;
- gl_tex = wined3d_texture_get_gl_texture(texture, srgb);
- target = texture->target;
+ gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
+ target = texture_gl->t.target;
if (gl_tex->name)
{
@@ -1016,7 +1016,7 @@ void wined3d_texture_bind(struct wined3d_texture *texture,
else
gl_tex->sampler_desc.srgb_decode = srgb;
gl_tex->base_level = 0;
- wined3d_texture_set_dirty(texture);
+ wined3d_texture_set_dirty(&texture_gl->t);
context_bind_texture(context, target, gl_tex->name);
@@ -1028,8 +1028,8 @@ void wined3d_texture_bind(struct wined3d_texture *texture,
* GL_TEXTURE_RECTANGLE_ARB.) */
if (target != GL_TEXTURE_RECTANGLE_ARB)
{
- TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", texture->level_count - 1);
- gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texture->level_count - 1);
+ TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", texture_gl->t.level_count - 1);
+ gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
checkGLcall("glTexParameteri(target, GL_TEXTURE_MAX_LEVEL, texture->level_count)");
}
@@ -1041,7 +1041,7 @@ void wined3d_texture_bind(struct wined3d_texture *texture,
gl_info->gl_ops.gl.p_glTexParameteri(target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
}
- if (texture->flags & WINED3D_TEXTURE_COND_NP2)
+ if (texture_gl->t.flags & WINED3D_TEXTURE_COND_NP2)
{
/* Conditinal non power of two textures use a different clamping
* default. If we're using the GL_WINE_normalized_texrect partial
@@ -1080,7 +1080,7 @@ void wined3d_texture_bind(struct wined3d_texture *texture,
}
/* Context activation is done by the caller. */
-void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
+void wined3d_texture_gl_bind_and_dirtify(struct wined3d_texture_gl *texture_gl,
struct wined3d_context *context, BOOL srgb)
{
/* We don't need a specific texture unit, but after binding the texture
@@ -1103,22 +1103,22 @@ void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
context_invalidate_compute_state(context, STATE_COMPUTE_SHADER_RESOURCE_BINDING);
context_invalidate_state(context, STATE_GRAPHICS_SHADER_RESOURCE_BINDING);
- wined3d_texture_bind(texture, context, srgb);
+ wined3d_texture_gl_bind(texture_gl, context, srgb);
}
/* Context activation is done by the caller (state handler). */
/* This function relies on the correct texture being bound and loaded. */
-void wined3d_texture_apply_sampler_desc(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 *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- GLenum target = texture->target;
+ GLenum target = texture_gl->t.target;
struct gl_texture *gl_tex;
DWORD state;
- TRACE("texture %p, sampler_desc %p, context %p.\n", texture, sampler_desc, context);
+ TRACE("texture_gl %p, sampler_desc %p, context %p.\n", texture_gl, sampler_desc, context);
- gl_tex = wined3d_texture_get_gl_texture(texture, texture->flags & WINED3D_TEXTURE_IS_SRGB);
+ gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, texture_gl->t.flags & WINED3D_TEXTURE_IS_SRGB);
state = sampler_desc->address_u;
if (state != gl_tex->sampler_desc.address_u)
@@ -1402,16 +1402,18 @@ void CDECL wined3d_texture_get_pitch(const struct wined3d_texture *texture,
DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod)
{
+ struct wined3d_resource *resource;
DWORD old = texture->lod;
TRACE("texture %p, lod %u.\n", texture, lod);
/* The d3d9:texture test shows that SetLOD is ignored on non-managed
* textures. The call always returns 0, and GetLOD always returns 0. */
- if (!wined3d_resource_access_is_managed(texture->resource.access))
+ resource = &texture->resource;
+ if (!wined3d_resource_access_is_managed(resource->access))
{
TRACE("Ignoring LOD on texture with resource access %s.\n",
- wined3d_debug_resource_access(texture->resource.access));
+ wined3d_debug_resource_access(resource->access));
return 0;
}
@@ -1420,14 +1422,14 @@ DWORD CDECL wined3d_texture_set_lod(struct wined3d_texture *texture, DWORD lod)
if (texture->lod != lod)
{
- struct wined3d_device *device = texture->resource.device;
+ struct wined3d_device *device = resource->device;
- wined3d_resource_wait_idle(&texture->resource);
+ wined3d_resource_wait_idle(resource);
texture->lod = lod;
- texture->texture_rgb.base_level = ~0u;
- texture->texture_srgb.base_level = ~0u;
- if (texture->resource.bind_count)
+ wined3d_texture_gl(texture)->texture_rgb.base_level = ~0u;
+ wined3d_texture_gl(texture)->texture_srgb.base_level = ~0u;
+ if (resource->bind_count)
wined3d_cs_emit_set_sampler_state(device->cs, texture->sampler, WINED3D_SAMP_MAX_MIP_LEVEL,
device->state.sampler_states[texture->sampler][WINED3D_SAMP_MAX_MIP_LEVEL]);
}
@@ -1777,7 +1779,7 @@ void wined3d_texture_prepare_texture(struct wined3d_texture *texture, struct win
}
format_gl = wined3d_format_gl(format);
- wined3d_texture_bind_and_dirtify(texture, context, srgb);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, srgb);
if (srgb)
internal = format_gl->srgb_internal;
@@ -2152,7 +2154,7 @@ void wined3d_texture_upload_data(struct wined3d_texture *texture, unsigned int s
for (i = 0; i < device->context_count; ++i)
{
- context_texture_update(device->contexts[i], texture);
+ context_texture_update(device->contexts[i], wined3d_texture_gl(texture));
}
}
}
@@ -2773,8 +2775,8 @@ static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_box src_box;
data.addr += sub_resource->offset;
- wined3d_texture_bind_and_dirtify(texture, context,
- location == WINED3D_LOCATION_TEXTURE_SRGB);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture),
+ context, location == WINED3D_LOCATION_TEXTURE_SRGB);
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
wined3d_texture_get_level_box(texture, sub_resource_idx % texture->level_count, &src_box);
wined3d_texture_upload_data(texture, sub_resource_idx, context, texture->resource.format,
@@ -2785,7 +2787,7 @@ static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_const_bo_address data = {sub_resource->buffer_object, NULL};
struct wined3d_box src_box;
- wined3d_texture_bind_and_dirtify(texture, context,
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context,
location == WINED3D_LOCATION_TEXTURE_SRGB);
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
wined3d_texture_get_level_box(texture, sub_resource_idx % texture->level_count, &src_box);
@@ -2806,9 +2808,9 @@ static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned in
data.addr += sub_resource->offset;
if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB)
- wined3d_texture_bind_and_dirtify(texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, FALSE);
else
- wined3d_texture_bind_and_dirtify(texture, context, TRUE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, TRUE);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
++texture->download_count;
@@ -2827,9 +2829,9 @@ static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_bo_address data = {sub_resource->buffer_object, NULL};
if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB)
- wined3d_texture_bind_and_dirtify(texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, FALSE);
else
- wined3d_texture_bind_and_dirtify(texture, context, TRUE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, TRUE);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
}
@@ -3214,9 +3216,9 @@ static void texture3d_srgb_transfer(struct wined3d_texture *texture, unsigned in
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
wined3d_texture_get_level_box(texture, sub_resource_idx % texture->level_count, &src_box);
- wined3d_texture_bind_and_dirtify(texture, context, !dest_is_srgb);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, !dest_is_srgb);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
- wined3d_texture_bind_and_dirtify(texture, context, dest_is_srgb);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, dest_is_srgb);
wined3d_texture_upload_data(texture, sub_resource_idx, context, texture->resource.format,
&src_box, wined3d_const_bo_address(&data), row_pitch, slice_pitch, 0, 0, 0, FALSE);
@@ -3243,8 +3245,8 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_box src_box;
data.addr += sub_resource->offset;
- wined3d_texture_bind_and_dirtify(texture, context,
- location == WINED3D_LOCATION_TEXTURE_SRGB);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture),
+ context, location == WINED3D_LOCATION_TEXTURE_SRGB);
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
wined3d_texture_get_level_box(texture, sub_resource_idx % texture->level_count, &src_box);
wined3d_texture_upload_data(texture, sub_resource_idx, context, texture->resource.format,
@@ -3255,8 +3257,8 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_const_bo_address data = {sub_resource->buffer_object, NULL};
struct wined3d_box src_box;
- wined3d_texture_bind_and_dirtify(texture, context,
- location == WINED3D_LOCATION_TEXTURE_SRGB);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture),
+ context, location == WINED3D_LOCATION_TEXTURE_SRGB);
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
wined3d_texture_get_level_box(texture, sub_resource_idx % texture->level_count, &src_box);
wined3d_texture_upload_data(texture, sub_resource_idx, context, texture->resource.format,
@@ -3284,9 +3286,9 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in
data.addr += sub_resource->offset;
if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB)
- wined3d_texture_bind_and_dirtify(texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, FALSE);
else
- wined3d_texture_bind_and_dirtify(texture, context, TRUE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, TRUE);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
++texture->download_count;
@@ -3305,9 +3307,9 @@ static BOOL texture3d_load_location(struct wined3d_texture *texture, unsigned in
struct wined3d_bo_address data = {sub_resource->buffer_object, NULL};
if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB)
- wined3d_texture_bind_and_dirtify(texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, FALSE);
else
- wined3d_texture_bind_and_dirtify(texture, context, TRUE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(texture), context, TRUE);
wined3d_texture_download_data(texture, sub_resource_idx, context, &data);
}
@@ -3843,7 +3845,7 @@ void wined3d_texture_upload_from_texture(struct wined3d_texture *dst_texture, un
wined3d_texture_prepare_texture(dst_texture, context, FALSE);
else
wined3d_texture_load_location(dst_texture, dst_sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB);
- wined3d_texture_bind_and_dirtify(dst_texture, context, FALSE);
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(dst_texture), context, FALSE);
src_level = src_sub_resource_idx % src_texture->level_count;
wined3d_texture_get_memory(src_texture, src_sub_resource_idx, &data,
@@ -3871,7 +3873,7 @@ void wined3d_texture_download_from_texture(struct wined3d_texture *dst_texture,
wined3d_texture_prepare_location(dst_texture, dst_sub_resource_idx, context, dst_location);
wined3d_texture_get_memory(dst_texture, dst_sub_resource_idx, &data, dst_location);
- wined3d_texture_bind_and_dirtify(src_texture, context,
+ wined3d_texture_gl_bind_and_dirtify(wined3d_texture_gl(src_texture), context,
!(src_texture->sub_resources[src_sub_resource_idx].locations & WINED3D_LOCATION_TEXTURE_RGB));
wined3d_texture_download_data(src_texture, src_sub_resource_idx, context, &data);
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 618b7454ed1..3b579a25f0f 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -166,7 +166,7 @@ static const struct wined3d_format *validate_resource_view(const struct wined3d_
}
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_view_desc *desc, struct wined3d_texture_gl *texture_gl,
const struct wined3d_format *view_format)
{
const struct wined3d_format_gl *view_format_gl;
@@ -178,7 +178,7 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
view_format_gl = wined3d_format_gl(view_format);
view->target = view_target;
- context = context_acquire(texture->resource.device, NULL, 0);
+ context = context_acquire(texture_gl->t.resource.device, NULL, 0);
gl_info = context->gl_info;
if (!gl_info->supported[ARB_TEXTURE_VIEW])
@@ -188,15 +188,15 @@ static void create_texture_view(struct wined3d_gl_view *view, GLenum view_target
return;
}
- wined3d_texture_prepare_texture(texture, context, FALSE);
- texture_name = wined3d_texture_get_texture_name(texture, context, FALSE);
+ wined3d_texture_prepare_texture(&texture_gl->t, context, FALSE);
+ texture_name = wined3d_texture_gl_get_texture_name(texture_gl, context, FALSE);
level_idx = desc->u.texture.level_idx;
layer_idx = desc->u.texture.layer_idx;
layer_count = desc->u.texture.layer_count;
if (view_target == GL_TEXTURE_3D)
{
- if (layer_idx || layer_count != wined3d_texture_get_level_depth(texture, level_idx))
+ if (layer_idx || layer_count != wined3d_texture_get_level_depth(&texture_gl->t, level_idx))
FIXME("Depth slice (%u-%u) not supported.\n", layer_idx, layer_count);
layer_idx = 0;
layer_count = 1;
@@ -537,13 +537,13 @@ static void wined3d_render_target_view_cs_init(void *object)
}
else
{
- struct wined3d_texture *texture = texture_from_resource(resource);
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(resource));
unsigned int depth_or_layer_count;
if (resource->type == WINED3D_RTYPE_TEXTURE_3D)
- depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
+ depth_or_layer_count = wined3d_texture_get_level_depth(&texture_gl->t, desc->u.texture.level_idx);
else
- depth_or_layer_count = texture->layer_count;
+ depth_or_layer_count = texture_gl->t.layer_count;
if (resource->format->id != view->format->id
|| (view->layer_count != 1 && view->layer_count != depth_or_layer_count))
@@ -558,13 +558,13 @@ static void wined3d_render_target_view_cs_init(void *object)
debug_d3dformat(resource->format->id), debug_d3dformat(view->format->id));
return;
}
- if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
+ if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
{
FIXME("Swapchain views not supported.\n");
return;
}
- create_texture_view(&view->gl_view, texture->target, desc, texture, view->format);
+ create_texture_view(&view->gl_view, texture_gl->t.target, desc, texture_gl, view->format);
}
}
}
@@ -742,32 +742,32 @@ static void wined3d_shader_resource_view_cs_init(void *object)
}
else
{
- struct wined3d_texture *texture = texture_from_resource(resource);
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(resource));
GLenum resource_class, view_class;
resource_class = wined3d_format_gl(resource->format)->view_class;
view_class = wined3d_format_gl(view_format)->view_class;
- view_target = get_texture_view_target(gl_info, desc, texture);
+ view_target = get_texture_view_target(gl_info, desc, &texture_gl->t);
- if (resource->format->id == view_format->id && texture->target == view_target
- && !desc->u.texture.level_idx && desc->u.texture.level_count == texture->level_count
- && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture->layer_count
+ if (resource->format->id == view_format->id && texture_gl->t.target == view_target
+ && !desc->u.texture.level_idx && desc->u.texture.level_count == texture_gl->t.level_count
+ && !desc->u.texture.layer_idx && desc->u.texture.layer_count == texture_gl->t.layer_count
&& !is_stencil_view_format(view_format))
{
TRACE("Creating identity shader resource view.\n");
}
- else if (texture->swapchain && texture->swapchain->desc.backbuffer_count > 1)
+ else if (texture_gl->t.swapchain && texture_gl->t.swapchain->desc.backbuffer_count > 1)
{
FIXME("Swapchain shader resource views not supported.\n");
}
else if (resource->format->typeless_id == view_format->typeless_id
&& resource_class == view_class)
{
- create_texture_view(&view->gl_view, view_target, desc, texture, view_format);
+ create_texture_view(&view->gl_view, view_target, desc, texture_gl, view_format);
}
else if (wined3d_format_is_depth_view(resource->format->id, view_format->id))
{
- create_texture_view(&view->gl_view, view_target, desc, texture, resource->format);
+ create_texture_view(&view->gl_view, view_target, desc, texture_gl, resource->format);
}
else
{
@@ -826,7 +826,7 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view
unsigned int unit, struct wined3d_sampler *sampler, struct wined3d_context *context)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- struct wined3d_texture *texture;
+ struct wined3d_texture_gl *texture_gl;
context_active_texture(context, gl_info, unit);
@@ -843,9 +843,9 @@ void wined3d_shader_resource_view_bind(struct wined3d_shader_resource_view *view
return;
}
- texture = wined3d_texture_from_resource(view->resource);
- wined3d_texture_bind(texture, context, FALSE);
- wined3d_sampler_bind(sampler, unit, texture, context);
+ texture_gl = wined3d_texture_gl(wined3d_texture_from_resource(view->resource));
+ wined3d_texture_gl_bind(texture_gl, context, FALSE);
+ wined3d_sampler_bind(sampler, unit, texture_gl, context);
}
/* Context activation is done by the caller. */
@@ -868,9 +868,9 @@ static void shader_resource_view_bind_and_dirtify(struct wined3d_shader_resource
void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *view)
{
- struct wined3d_texture *texture = texture_from_resource(view->resource);
unsigned int i, j, layer_count, level_count, base_level, max_level;
const struct wined3d_gl_info *gl_info;
+ struct wined3d_texture_gl *texture_gl;
struct wined3d_context *context;
struct gl_texture *gl_tex;
DWORD location;
@@ -885,10 +885,11 @@ void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *
base_level = view->desc.u.texture.level_idx;
max_level = base_level + level_count - 1;
- srgb = !!(texture->flags & WINED3D_TEXTURE_IS_SRGB);
+ texture_gl = wined3d_texture_gl(texture_from_resource(view->resource));
+ srgb = !!(texture_gl->t.flags & WINED3D_TEXTURE_IS_SRGB);
location = srgb ? WINED3D_LOCATION_TEXTURE_SRGB : WINED3D_LOCATION_TEXTURE_RGB;
for (i = 0; i < layer_count; ++i)
- wined3d_texture_load_location(texture, i * level_count + base_level, context, location);
+ wined3d_texture_load_location(&texture_gl->t, i * level_count + base_level, context, location);
if (view->gl_view.name)
{
@@ -896,37 +897,38 @@ void shader_resource_view_generate_mipmaps(struct wined3d_shader_resource_view *
}
else
{
- wined3d_texture_bind_and_dirtify(texture, context, srgb);
- gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, base_level);
- gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, max_level);
+ wined3d_texture_gl_bind_and_dirtify(texture_gl, context, srgb);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_BASE_LEVEL, base_level);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_MAX_LEVEL, max_level);
}
if (gl_info->supported[ARB_SAMPLER_OBJECTS])
GL_EXTCALL(glBindSampler(context->active_texture, 0));
- gl_tex = wined3d_texture_get_gl_texture(texture, srgb);
+ gl_tex = wined3d_texture_gl_get_gl_texture(texture_gl, srgb);
if (context->d3d_info->wined3d_creation_flags & WINED3D_SRGB_READ_WRITE_CONTROL)
{
- gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_SRGB_DECODE_EXT,
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target, GL_TEXTURE_SRGB_DECODE_EXT,
GL_SKIP_DECODE_EXT);
gl_tex->sampler_desc.srgb_decode = FALSE;
}
- gl_info->fbo_ops.glGenerateMipmap(texture->target);
+ gl_info->fbo_ops.glGenerateMipmap(texture_gl->t.target);
checkGLcall("glGenerateMipMap()");
for (i = 0; i < layer_count; ++i)
{
for (j = base_level + 1; j <= max_level; ++j)
{
- wined3d_texture_validate_location(texture, i * level_count + j, location);
- wined3d_texture_invalidate_location(texture, i * level_count + j, ~location);
+ wined3d_texture_validate_location(&texture_gl->t, i * level_count + j, location);
+ wined3d_texture_invalidate_location(&texture_gl->t, i * level_count + j, ~location);
}
}
if (!view->gl_view.name)
{
gl_tex->base_level = base_level;
- gl_info->gl_ops.gl.p_glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, texture->level_count - 1);
+ gl_info->gl_ops.gl.p_glTexParameteri(texture_gl->t.target,
+ GL_TEXTURE_MAX_LEVEL, texture_gl->t.level_count - 1);
}
context_release(context);
@@ -1129,18 +1131,18 @@ static void wined3d_unordered_access_view_cs_init(void *object)
}
else
{
- struct wined3d_texture *texture = texture_from_resource(resource);
+ struct wined3d_texture_gl *texture_gl = wined3d_texture_gl(texture_from_resource(resource));
unsigned int depth_or_layer_count;
if (resource->type == WINED3D_RTYPE_TEXTURE_3D)
- depth_or_layer_count = wined3d_texture_get_level_depth(texture, desc->u.texture.level_idx);
+ depth_or_layer_count = wined3d_texture_get_level_depth(&texture_gl->t, desc->u.texture.level_idx);
else
- depth_or_layer_count = texture->layer_count;
+ depth_or_layer_count = texture_gl->t.layer_count;
if (desc->u.texture.layer_idx || desc->u.texture.layer_count != depth_or_layer_count)
{
- create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, texture),
- desc, texture, view->format);
+ create_texture_view(&view->gl_view, get_texture_view_target(gl_info, desc, &texture_gl->t),
+ desc, texture_gl, view->format);
}
}
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index e4cd7d39984..861c6475420 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -72,6 +72,12 @@
#define WINED3D_QUIRK_LIMITED_TEX_FILTERING 0x00000100
#define WINED3D_QUIRK_BROKEN_ARB_FOG 0x00000200
+struct fragment_pipeline;
+struct wined3d_context;
+struct wined3d_state;
+struct wined3d_texture_gl;
+struct wined3d_vertex_pipe_ops;
+
enum wined3d_ffp_idx
{
WINED3D_FFP_POSITION = 0,
@@ -1392,11 +1398,6 @@ struct gs_compile_args
DWORD interpolation_mode[WINED3D_PACKED_INTERPOLATION_SIZE];
};
-struct wined3d_context;
-struct wined3d_state;
-struct fragment_pipeline;
-struct wined3d_vertex_pipe_ops;
-
struct wined3d_shader_backend_ops
{
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
@@ -2166,10 +2167,10 @@ struct wined3d_context *context_create(struct wined3d_swapchain *swapchain, stru
const struct wined3d_format *ds_format) DECLSPEC_HIDDEN;
HGLRC context_create_wgl_attribs(const struct wined3d_gl_info *gl_info, HDC hdc, HGLRC share_ctx) DECLSPEC_HIDDEN;
void context_destroy(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
-void context_draw_shaded_quad(struct wined3d_context *context, struct wined3d_texture *texture,
+void context_draw_shaded_quad(struct wined3d_context *context, 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) DECLSPEC_HIDDEN;
-void context_draw_textured_quad(struct wined3d_context *context, struct wined3d_texture *texture,
+void context_draw_textured_quad(struct wined3d_context *context, 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) DECLSPEC_HIDDEN;
void context_enable_clip_distances(struct wined3d_context *context, unsigned int mask) DECLSPEC_HIDDEN;
@@ -2202,7 +2203,8 @@ void context_state_drawbuf(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
void context_state_fb(struct wined3d_context *context,
const struct wined3d_state *state, DWORD state_id) DECLSPEC_HIDDEN;
-void context_texture_update(struct wined3d_context *context, const struct wined3d_texture *texture) DECLSPEC_HIDDEN;
+void context_texture_update(struct wined3d_context *context,
+ const struct wined3d_texture_gl *texture_gl) DECLSPEC_HIDDEN;
void context_unload_tex_coords(const struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_unmap_bo_address(struct wined3d_context *context,
const struct wined3d_bo_address *data, GLenum binding) DECLSPEC_HIDDEN;
@@ -3169,13 +3171,6 @@ void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DEC
#define RESOURCE_ALIGNMENT 16
#define WINED3D_CONSTANT_BUFFER_ALIGNMENT 16
-struct gl_texture
-{
- struct wined3d_sampler_desc sampler_desc;
- unsigned int base_level;
- GLuint name;
-};
-
struct wined3d_blt_info
{
GLenum bind_target;
@@ -3211,7 +3206,6 @@ struct wined3d_texture
{
struct wined3d_resource resource;
const struct wined3d_texture_ops *texture_ops;
- struct gl_texture texture_rgb, texture_srgb;
struct wined3d_swapchain *swapchain;
unsigned int pow2_width;
unsigned int pow2_height;
@@ -3296,12 +3290,6 @@ static inline GLenum wined3d_texture_get_sub_resource_target(const struct wined3
? cube_targets[sub_resource_idx / texture->level_count] : texture->target;
}
-static inline struct gl_texture *wined3d_texture_get_gl_texture(struct wined3d_texture *texture,
- BOOL srgb)
-{
- return srgb ? &texture->texture_srgb : &texture->texture_rgb;
-}
-
static inline unsigned int wined3d_texture_get_level_width(const struct wined3d_texture *texture,
unsigned int level)
{
@@ -3358,12 +3346,6 @@ BOOL texture2d_load_sysmem(struct wined3d_texture *texture, unsigned int sub_res
BOOL texture2d_load_texture(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
-void wined3d_texture_apply_sampler_desc(struct wined3d_texture *texture,
- const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context) DECLSPEC_HIDDEN;
-void wined3d_texture_bind(struct wined3d_texture *texture,
- struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
-void wined3d_texture_bind_and_dirtify(struct wined3d_texture *texture,
- struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
HRESULT wined3d_texture_check_box_dimensions(const struct wined3d_texture *texture,
unsigned int level, const struct wined3d_box *box) DECLSPEC_HIDDEN;
void wined3d_texture_download_data(struct wined3d_texture *texture, unsigned int sub_resource_idx,
@@ -3400,10 +3382,19 @@ void wined3d_texture_validate_location(struct wined3d_texture *texture,
void wined3d_gl_texture_swizzle_from_color_fixup(GLint swizzle[4], struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
+struct gl_texture
+{
+ struct wined3d_sampler_desc sampler_desc;
+ unsigned int base_level;
+ GLuint name;
+};
+
struct wined3d_texture_gl
{
struct wined3d_texture t;
+ struct gl_texture texture_rgb, texture_srgb;
+
GLuint rb_multisample;
GLuint rb_resolved;
@@ -3416,6 +3407,18 @@ static inline struct wined3d_texture_gl *wined3d_texture_gl(struct wined3d_textu
return CONTAINING_RECORD(texture, struct wined3d_texture_gl, t);
}
+static inline struct gl_texture *wined3d_texture_gl_get_gl_texture(struct wined3d_texture_gl *texture_gl,
+ BOOL srgb)
+{
+ return srgb ? &texture_gl->texture_srgb : &texture_gl->texture_rgb;
+}
+
+void wined3d_texture_gl_apply_sampler_desc(struct wined3d_texture_gl *texture_gl,
+ const struct wined3d_sampler_desc *sampler_desc, const struct wined3d_context *context) DECLSPEC_HIDDEN;
+void wined3d_texture_gl_bind(struct wined3d_texture_gl *texture_gl,
+ struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
+void wined3d_texture_gl_bind_and_dirtify(struct wined3d_texture_gl *texture_gl,
+ struct wined3d_context *context, BOOL srgb) DECLSPEC_HIDDEN;
void wined3d_texture_gl_set_compatible_renderbuffer(struct wined3d_texture_gl *texture_gl,
struct wined3d_context *context, unsigned int level,
const struct wined3d_rendertarget_info *rt) DECLSPEC_HIDDEN;
@@ -3476,7 +3479,7 @@ struct wined3d_sampler
};
void wined3d_sampler_bind(struct wined3d_sampler *sampler, unsigned int unit,
- struct wined3d_texture *texture, const struct wined3d_context *context) DECLSPEC_HIDDEN;
+ struct wined3d_texture_gl *texture_gl, const struct wined3d_context *context) DECLSPEC_HIDDEN;
struct wined3d_vertex_declaration_element
{
@@ -4506,11 +4509,11 @@ static inline BOOL needs_srgb_write(const struct wined3d_context *context,
&& fb->render_targets[0] && fb->render_targets[0]->format_flags & WINED3DFMT_FLAG_SRGB_WRITE;
}
-static inline GLuint wined3d_texture_get_texture_name(const struct wined3d_texture *texture,
+static inline GLuint wined3d_texture_gl_get_texture_name(const struct wined3d_texture_gl *texture_gl,
const struct wined3d_context *context, BOOL srgb)
{
- return srgb && needs_separate_srgb_gl_texture(context, texture)
- ? texture->texture_srgb.name : texture->texture_rgb.name;
+ return srgb && needs_separate_srgb_gl_texture(context, &texture_gl->t)
+ ? texture_gl->texture_srgb.name : texture_gl->texture_rgb.name;
}
static inline BOOL can_use_texture_swizzle(const struct wined3d_gl_info *gl_info, const struct wined3d_format *format)
--
2.11.0
2
1
[PATCH v6] comctl32: Implement handling of EM_SETCUEBANNER/EM_GETCUEBANNER messages.
by Sergio Gómez Del Real 30 Oct '18
by Sergio Gómez Del Real 30 Oct '18
30 Oct '18
Signed-off-by: Sergio Gómez Del Real <sdelreal(a)codeweavers.com>
---
dlls/comctl32/edit.c | 67 ++++++++++++++++++++++++++++++++
dlls/comctl32/tests/edit.c | 78 ++++++++++++++++++++++++++++++++++++++
2 files changed, 145 insertions(+)
diff --git a/dlls/comctl32/edit.c b/dlls/comctl32/edit.c
index f0180adfbe..aeba9f73e7 100644
--- a/dlls/comctl32/edit.c
+++ b/dlls/comctl32/edit.c
@@ -131,6 +131,7 @@ typedef struct
should be sent to the first parent. */
HWND hwndListBox; /* handle of ComboBox's listbox or NULL */
INT wheelDeltaRemainder; /* scroll wheel delta left over after scrolling whole lines */
+ WCHAR *cue_banner_text;
/*
* only for multi line controls
*/
@@ -2181,6 +2182,12 @@ static void EDIT_PaintLine(EDITSTATE *es, HDC dc, INT line, BOOL rev)
x += EDIT_PaintText(es, dc, x, y, line, e - li, li + ll - e, FALSE);
} else
x += EDIT_PaintText(es, dc, x, y, line, 0, ll, FALSE);
+
+ if (es->cue_banner_text && es->text_length == 0 && !(es->flags & EF_FOCUSED))
+ {
+ SetTextColor(dc, GetSysColor(COLOR_GRAYTEXT));
+ TextOutW(dc, x, y, es->cue_banner_text, strlenW(es->cue_banner_text));
+ }
}
@@ -4152,6 +4159,57 @@ static LRESULT EDIT_EM_GetThumb(EDITSTATE *es)
EDIT_WM_HScroll(es, EM_GETTHUMB, 0));
}
+static inline WCHAR *heap_strdupW(const WCHAR *str)
+{
+ int len = strlenW(str) + 1;
+ WCHAR *ret = heap_alloc(len * sizeof(WCHAR));
+ strcpyW(ret, str);
+ return ret;
+}
+
+/*********************************************************************
+ *
+ * EM_SETCUEBANNER
+ *
+ */
+static BOOL EDIT_EM_SetCueBanner(EDITSTATE *es, BOOL focus, const WCHAR *cue_text)
+{
+ if (es->style & ES_MULTILINE || !cue_text)
+ return FALSE;
+
+ if (focus)
+ FIXME("cue banner for focused control not implemented.\n");
+
+ heap_free(es->cue_banner_text);
+ es->cue_banner_text = heap_strdupW(cue_text);
+
+ return TRUE;
+}
+
+/*********************************************************************
+ *
+ * EM_GETCUEBANNER
+ *
+ */
+static BOOL EDIT_EM_GetCueBanner(EDITSTATE *es, WCHAR *buf, DWORD size)
+{
+ if (es->style & ES_MULTILINE)
+ return FALSE;
+
+ if (!es->cue_banner_text)
+ {
+ if (buf && size)
+ *buf = 0;
+ return FALSE;
+ }
+ else
+ {
+ if (buf)
+ lstrcpynW(buf, es->cue_banner_text, size);
+ return TRUE;
+ }
+}
+
/********************************************************************
*
@@ -4489,6 +4547,7 @@ static LRESULT EDIT_WM_NCDestroy(EDITSTATE *es)
SetWindowLongPtrW( es->hwndSelf, 0, 0 );
heap_free(es->undo_text);
+ heap_free(es->cue_banner_text);
heap_free(es);
return 0;
@@ -4703,6 +4762,14 @@ static LRESULT CALLBACK EDIT_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
result = EDIT_EM_CharFromPos(es, (short)LOWORD(lParam), (short)HIWORD(lParam));
break;
+ case EM_SETCUEBANNER:
+ result = EDIT_EM_SetCueBanner(es, (BOOL)wParam, (const WCHAR *)lParam);
+ break;
+
+ case EM_GETCUEBANNER:
+ result = EDIT_EM_GetCueBanner(es, (WCHAR *)wParam, (DWORD)lParam);
+ break;
+
/* End of the EM_ messages which were in numerical order; what order
* are these in? vaguely alphabetical?
*/
diff --git a/dlls/comctl32/tests/edit.c b/dlls/comctl32/tests/edit.c
index a5097d1cbb..bc44d0c240 100644
--- a/dlls/comctl32/tests/edit.c
+++ b/dlls/comctl32/tests/edit.c
@@ -3061,6 +3061,83 @@ static const struct message killfocus_combined_seq[] =
{ 0 }
};
+static void test_cue_banner(void)
+{
+ HWND hwnd_edit;
+ BOOL ret;
+ static WCHAR getcuetestW[5] = {'T',0};
+ static const WCHAR testcmp1W[] = {'T','e','s','t',0};
+ static const WCHAR testcmp2W[] = {'T','e','s',0};
+ static const WCHAR emptyW[] = {0};
+
+ hwnd_edit = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0);
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ if (lstrcmpW(getcuetestW, emptyW) != 0)
+ {
+ win_skip("skipping for Win XP and 2003 Server.\n");
+ DestroyWindow(hwnd_edit);
+ return;
+ }
+ ok(lstrcmpW(getcuetestW, emptyW) == 0, "First char is %c\n", getcuetestW[0]);
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ lstrcpyW(getcuetestW, testcmp1W);
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 0);
+ ok(lstrcmpW(getcuetestW, testcmp1W) == 0, "String was %s.\n", wine_dbgstr_w(getcuetestW));
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_SETCUEBANNER should have returned FALSE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, 0, 0);
+ ok(ret == FALSE, "EM_GETCUEBANNER should have returned FALSE.\n");
+
+ lstrcpyW(getcuetestW, testcmp1W);
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)getcuetestW);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, 0, 5);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(getcuetestW, testcmp1W) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)emptyW);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(getcuetestW, emptyW) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+
+ /* EM_GETCUEBANNER's buffer size includes null char */
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)testcmp1W);
+ ok(ret == TRUE, "EM_SETCUEBANNER should have returned TRUE.\n");
+ memset(getcuetestW, 0, lstrlenW(testcmp1W)*sizeof(WCHAR));
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, (LPARAM)lstrlenW(testcmp1W)+1);
+ ok(ret == TRUE, "EM_GETCUEBANNER should have returned TRUE.\n");
+ ok(lstrcmpW(getcuetestW, testcmp1W) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+ memset(getcuetestW, 0, lstrlenW(testcmp1W)*sizeof(WCHAR));
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, (LPARAM)lstrlenW(testcmp1W));
+ ok(lstrcmpW(getcuetestW, testcmp2W) == 0, "EM_GETCUEBANNER returned string %s.\n", wine_dbgstr_w(getcuetestW));
+ DestroyWindow(hwnd_edit);
+
+ /* setting cue banner fails for multi-line edit controls */
+ hwnd_edit = create_editcontrolW(ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 0);
+ lstrcpyW(getcuetestW, testcmp1W);
+ ret = SendMessageW(hwnd_edit, EM_GETCUEBANNER, (WPARAM)getcuetestW, 5);
+ ok(ret == FALSE, "EM_SETCUEBANNER.\n");
+ ok(lstrcmpW(getcuetestW, testcmp1W) == 0, "String was %s.\n", wine_dbgstr_w(getcuetestW));
+ ret = SendMessageW(hwnd_edit, EM_SETCUEBANNER, 0, (LPARAM)getcuetestW);
+ ok(ret == FALSE, "EM_SETCUEBANNER.\n");
+
+ DestroyWindow(hwnd_edit);
+}
+
static void test_change_focus(void)
{
HWND hwnd, parent_wnd;
@@ -3138,6 +3215,7 @@ START_TEST(edit)
test_EM_GETLINE();
test_wordbreak_proc();
test_change_focus();
+ test_cue_banner();
UnregisterWindowClasses();
--
2.17.1
3
2
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 34 +++++++++-----
dlls/comctl32/tests/taskdialog.c | 77 ++++++++++++++++++++++++++++++++
2 files changed, 99 insertions(+), 12 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 0adfb2f32c..5645d53f79 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -95,7 +95,8 @@ struct button_layout_info
LONG line;
};
-static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, HWND hwnd);
+static HRESULT taskdialog_notify(struct taskdialog_info *dialog_info, UINT notification, WPARAM wparam, LPARAM lparam);
+static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, HWND hwnd, WORD id);
static void taskdialog_layout(struct taskdialog_info *dialog_info);
static void taskdialog_du_to_px(struct taskdialog_info *dialog_info, LONG *width, LONG *height)
@@ -209,9 +210,7 @@ static void taskdialog_enable_button(const struct taskdialog_info *dialog_info,
static void taskdialog_click_button(struct taskdialog_info *dialog_info, INT id)
{
- HWND hwnd = taskdialog_find_button(dialog_info->command_links, dialog_info->command_link_count, id);
- if (!hwnd) hwnd = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, id);
- if (hwnd) taskdialog_on_button_click(dialog_info, hwnd);
+ if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, id, 0) == S_OK) EndDialog(dialog_info->hwnd, id);
}
static void taskdialog_button_set_shield(const struct taskdialog_info *dialog_info, INT id, BOOL elevate)
@@ -303,19 +302,22 @@ static void taskdialog_toggle_expando_control(struct taskdialog_info *dialog_inf
}
}
-static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, HWND hwnd)
+static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, HWND hwnd, WORD id)
{
- INT command_id = GetWindowLongW(hwnd, GWLP_ID);
- HWND radio_button;
+ INT command_id;
+ HWND button, radio_button;
+
+ /* Prefer the id from hwnd because the id from WM_COMMAND is truncated to WORD */
+ command_id = hwnd ? GetWindowLongW(hwnd, GWLP_ID) : id;
- if (hwnd == dialog_info->expando_button)
+ if (hwnd && hwnd == dialog_info->expando_button)
{
taskdialog_toggle_expando_control(dialog_info);
taskdialog_notify(dialog_info, TDN_EXPANDO_BUTTON_CLICKED, dialog_info->expanded, 0);
return;
}
- if (hwnd == dialog_info->verification_box)
+ if (hwnd && hwnd == dialog_info->verification_box)
{
dialog_info->verification_checked = !dialog_info->verification_checked;
taskdialog_notify(dialog_info, TDN_VERIFICATION_CLICKED, dialog_info->verification_checked, 0);
@@ -330,7 +332,15 @@ static void taskdialog_on_button_click(struct taskdialog_info *dialog_info, HWND
return;
}
- if (taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
+ button = taskdialog_find_button(dialog_info->command_links, dialog_info->command_link_count, command_id);
+ if (!button) button = taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, command_id);
+ if (!button && command_id == IDOK)
+ {
+ button = dialog_info->command_link_count > 0 ? dialog_info->command_links[0] : dialog_info->buttons[0];
+ command_id = GetWindowLongW(button, GWLP_ID);
+ }
+
+ if (button && taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, command_id, 0) == S_OK)
EndDialog(dialog_info->hwnd, command_id);
}
@@ -582,7 +592,7 @@ static void taskdialog_check_default_radio_buttons(struct taskdialog_info *dialo
if (default_button)
{
SendMessageW(default_button, BM_SETCHECK, BST_CHECKED, 0);
- taskdialog_on_button_click(dialog_info, default_button);
+ taskdialog_on_button_click(dialog_info, default_button, 0);
}
}
@@ -1332,7 +1342,7 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
- taskdialog_on_button_click(dialog_info, (HWND)lParam);
+ taskdialog_on_button_click(dialog_info, (HWND)lParam, LOWORD(wParam));
break;
}
return FALSE;
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 8f4c97b750..d25c67f7bc 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -229,6 +229,66 @@ static const struct message_info msg_return_press_negative_id_radio_button[] =
{ 0 }
};
+static const struct message_info msg_send_all_common_button_click[] =
+{
+ { TDM_CLICK_BUTTON, IDOK, 0 },
+ { TDM_CLICK_BUTTON, IDYES, 0 },
+ { TDM_CLICK_BUTTON, IDNO, 0 },
+ { TDM_CLICK_BUTTON, IDCANCEL, 0 },
+ { TDM_CLICK_BUTTON, IDRETRY, 0 },
+ { TDM_CLICK_BUTTON, IDCLOSE, 0 },
+ { TDM_CLICK_BUTTON, ID_START_BUTTON + 99, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_press_nonexistent_buttons[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_all_common_button_click },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, IDYES, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, IDNO, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, IDCANCEL, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, IDRETRY, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, IDCLOSE, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, ID_START_BUTTON + 99, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_send_all_common_button_click_with_command[] =
+{
+ { WM_COMMAND, MAKEWORD(IDOK, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDYES, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDNO, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDCANCEL, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDRETRY, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDCLOSE, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(ID_START_BUTTON + 99, BN_CLICKED), 0 },
+ { WM_COMMAND, MAKEWORD(IDOK, BN_CLICKED), 0 },
+ { 0 }
+};
+
+static const struct message_info msg_press_nonexistent_buttons_with_command[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_all_common_button_click_with_command },
+ { TDN_BUTTON_CLICKED, ID_START_BUTTON, 0, S_FALSE, NULL },
+ { TDN_BUTTON_CLICKED, ID_START_BUTTON, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_send_nonexistent_radio_button_click[] =
+{
+ { TDM_CLICK_RADIO_BUTTON, ID_START_RADIO_BUTTON + 99, 0 },
+ { TDM_CLICK_BUTTON, IDOK, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_press_nonexistent_radio_button[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_nonexistent_radio_button_click },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
static const struct message_info msg_return_default_verification_unchecked[] =
{
{ TDN_CREATED, 0, 0, S_OK, msg_send_click_ok },
@@ -568,6 +628,23 @@ static void test_buttons(void)
info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
run_test(&info, IDOK, -2, FALSE, msg_return_press_negative_id_radio_button,
"radio button: manually click radio button with negative id");
+
+ /* Test sending clicks to non-existent buttons. Notification of non-existent buttons will be sent */
+ info.cButtons = TEST_NUM_BUTTONS;
+ info.pButtons = custom_buttons;
+ info.cRadioButtons = TEST_NUM_RADIO_BUTTONS;
+ info.pRadioButtons = radio_buttons;
+ info.dwCommonButtons = 0;
+ info.dwFlags = TDF_NO_DEFAULT_RADIO_BUTTON;
+ run_test(&info, ID_START_BUTTON + 99, 0, FALSE, msg_press_nonexistent_buttons, "sends click to non-existent buttons");
+
+ /* Non-existent button clicks sent by WM_COMMAND won't generate TDN_BUTTON_CLICKED except IDOK.
+ * And will get the first existent button identifier instead of IDOK */
+ run_test(&info, ID_START_BUTTON, 0, FALSE, msg_press_nonexistent_buttons_with_command,
+ "sends click to non-existent buttons with WM_COMMAND");
+
+ /* Non-existent radio button won't get notifications */
+ run_test(&info, IDOK, 0, FALSE, msg_press_nonexistent_radio_button, "sends click to non-existent radio buttons");
}
static void test_help(void)
--
2.19.1
2
1
[PATCH 2/3] comctl32/taskdialog: Add support for TDF_ALLOW_DIALOG_CANCELLATION.
by Zhiyi Zhang 30 Oct '18
by Zhiyi Zhang 30 Oct '18
30 Oct '18
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 17 +++++++++++
dlls/comctl32/tests/taskdialog.c | 49 ++++++++++++++++++++++++++++++++
2 files changed, 66 insertions(+)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 9bfdef939e..0adfb2f32c 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -84,6 +84,7 @@ struct taskdialog_info
INT selected_radio_id;
BOOL verification_checked;
BOOL expanded;
+ BOOL has_cancel;
WCHAR *expanded_text;
WCHAR *collapsed_text;
};
@@ -1197,6 +1198,13 @@ static void taskdialog_init(struct taskdialog_info *dialog_info, HWND hwnd)
id = GetWindowLongW(dialog_info->default_button, GWLP_ID);
SendMessageW(dialog_info->hwnd, DM_SETDEFID, id, 0);
+ dialog_info->has_cancel =
+ (taskconfig->dwFlags & TDF_ALLOW_DIALOG_CANCELLATION)
+ || taskdialog_find_button(dialog_info->command_links, dialog_info->command_link_count, IDCANCEL)
+ || taskdialog_find_button(dialog_info->buttons, dialog_info->button_count, IDCANCEL);
+
+ if (!dialog_info->has_cancel) DeleteMenu(GetSystemMenu(hwnd, FALSE), SC_CLOSE, MF_BYCOMMAND);
+
taskdialog_layout(dialog_info);
}
@@ -1369,6 +1377,15 @@ static INT_PTR CALLBACK taskdialog_proc(HWND hwnd, UINT msg, WPARAM wParam, LPAR
RemovePropW(hwnd, taskdialog_info_propnameW);
taskdialog_destroy(dialog_info);
break;
+ case WM_CLOSE:
+ if (dialog_info->has_cancel)
+ {
+ if(taskdialog_notify(dialog_info, TDN_BUTTON_CLICKED, IDCANCEL, 0) == S_OK)
+ EndDialog(hwnd, IDCANCEL);
+ SetWindowLongPtrW(hwnd, DWLP_MSGRESULT, 0);
+ break;
+ }
+ return FALSE;
default:
return FALSE;
}
diff --git a/dlls/comctl32/tests/taskdialog.c b/dlls/comctl32/tests/taskdialog.c
index 093671c30f..8f4c97b750 100644
--- a/dlls/comctl32/tests/taskdialog.c
+++ b/dlls/comctl32/tests/taskdialog.c
@@ -290,6 +290,34 @@ static const struct message_info msg_return_navigated_page[] =
{ 0 }
};
+static const struct message_info msg_send_close[] =
+{
+ { WM_CLOSE, 0, 0, 0},
+ { 0 }
+};
+
+static const struct message_info msg_handle_wm_close[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_close },
+ { TDN_BUTTON_CLICKED, IDCANCEL, 0, S_FALSE, msg_send_close },
+ { TDN_BUTTON_CLICKED, IDCANCEL, 0, S_OK, NULL },
+ { 0 }
+};
+
+static const struct message_info msg_send_close_then_ok[] =
+{
+ { WM_CLOSE, 0, 0, 0},
+ { TDM_CLICK_BUTTON, IDOK, 0 },
+ { 0 }
+};
+
+static const struct message_info msg_handle_wm_close_without_cancel_button[] =
+{
+ { TDN_CREATED, 0, 0, S_OK, msg_send_close_then_ok },
+ { TDN_BUTTON_CLICKED, IDOK, 0, S_OK, NULL },
+ { 0 }
+};
+
static void init_test_message(UINT message, WPARAM wParam, LPARAM lParam, struct message *msg)
{
msg->message = WM_TD_CALLBACK;
@@ -739,6 +767,26 @@ static void test_navigate_page(void)
run_test(&info, IDOK, ID_START_RADIO_BUTTON, TRUE, msg_return_navigated_page, "navigate page: invalid taskconfig cbSize");
}
+static void test_wm_close(void)
+{
+ TASKDIALOGCONFIG info = {0};
+
+ info.cbSize = sizeof(TASKDIALOGCONFIG);
+ info.pfCallback = taskdialog_callback_proc;
+ info.lpCallbackData = test_ref_data;
+
+ /* WM_CLOSE can end the dialog only when a cancel button is present or dwFlags has TDF_ALLOW_DIALOG_CANCELLATION */
+ info.dwCommonButtons = TDCBF_OK_BUTTON;
+ run_test(&info, IDOK, 0, FALSE, msg_handle_wm_close_without_cancel_button, "send WM_CLOSE without cancel button");
+
+ info.dwFlags = TDF_ALLOW_DIALOG_CANCELLATION;
+ run_test(&info, IDCANCEL, 0, FALSE, msg_handle_wm_close, "send WM_CLOSE with TDF_ALLOW_DIALOG_CANCELLATION");
+
+ info.dwFlags = 0;
+ info.dwCommonButtons = TDCBF_CANCEL_BUTTON;
+ run_test(&info, IDCANCEL, 0, FALSE, msg_handle_wm_close, "send WM_CLOSE with a cancel button");
+}
+
START_TEST(taskdialog)
{
ULONG_PTR ctx_cookie;
@@ -780,6 +828,7 @@ START_TEST(taskdialog)
test_progress_bar();
test_verification_box();
test_navigate_page();
+ test_wm_close();
unload_v6_module(ctx_cookie, hCtx);
}
--
2.19.1
2
1
This fix tests on 64bit because id is a signed int.
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/comctl32/taskdialog.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/comctl32/taskdialog.c b/dlls/comctl32/taskdialog.c
index 1d91e1d55d..9bfdef939e 100644
--- a/dlls/comctl32/taskdialog.c
+++ b/dlls/comctl32/taskdialog.c
@@ -666,7 +666,7 @@ static void taskdialog_add_radio_buttons(struct taskdialog_info *dialog_info)
textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pRadioButtons[i].pszButtonText);
dialog_info->radio_buttons[i] =
CreateWindowW(WC_BUTTONW, textW, i == 0 ? style | WS_GROUP : style, 0, 0, 0, 0, dialog_info->hwnd,
- ULongToHandle(taskconfig->pRadioButtons[i].nButtonID), 0, NULL);
+ LongToHandle(taskconfig->pRadioButtons[i].nButtonID), 0, NULL);
SendMessageW(dialog_info->radio_buttons[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
Free(textW);
}
@@ -692,7 +692,7 @@ static void taskdialog_add_command_links(struct taskdialog_info *dialog_info)
style = is_default ? default_style | BS_DEFCOMMANDLINK : default_style | BS_COMMANDLINK;
textW = taskdialog_gettext(dialog_info, TRUE, taskconfig->pButtons[i].pszButtonText);
dialog_info->command_links[i] = CreateWindowW(WC_BUTTONW, textW, style, 0, 0, 0, 0, dialog_info->hwnd,
- ULongToHandle(taskconfig->pButtons[i].nButtonID), 0, NULL);
+ LongToHandle(taskconfig->pButtons[i].nButtonID), 0, NULL);
SendMessageW(dialog_info->command_links[i], WM_SETFONT, (WPARAM)dialog_info->font, 0);
Free(textW);
--
2.19.1
2
1
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46035
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
.../api-ms-win-core-libraryloader-l1-1-0.spec | 2 +-
.../api-ms-win-core-libraryloader-l1-1-1.spec | 2 +-
.../api-ms-win-core-libraryloader-l1-2-0.spec | 2 +-
dlls/kernel32/kernel32.spec | 2 +-
dlls/kernel32/locale.c | 49 +++++++++++++
dlls/kernel32/tests/locale.c | 70 +++++++++++++++++++
dlls/kernelbase/kernelbase.spec | 2 +-
include/libloaderapi.h | 1 +
8 files changed, 125 insertions(+), 5 deletions(-)
diff --git a/dlls/api-ms-win-core-libraryloader-l1-1-0/api-ms-win-core-libraryloader-l1-1-0.spec b/dlls/api-ms-win-core-libraryloader-l1-1-0/api-ms-win-core-libraryloader-l1-1-0.spec
index 7d1fcac9e2..a011bee54f 100644
--- a/dlls/api-ms-win-core-libraryloader-l1-1-0/api-ms-win-core-libraryloader-l1-1-0.spec
+++ b/dlls/api-ms-win-core-libraryloader-l1-1-0/api-ms-win-core-libraryloader-l1-1-0.spec
@@ -7,7 +7,7 @@
@ stub EnumResourceTypesExA
@ stub EnumResourceTypesExW
@ stdcall FindResourceExW(long wstr wstr long) kernel32.FindResourceExW
-@ stub FindStringOrdinal
+@ stdcall FindStringOrdinal(long wstr long wstr long long) kernel32.FindStringOrdinal
@ stdcall FreeLibrary(long) kernel32.FreeLibrary
@ stdcall FreeLibraryAndExitThread(long long) kernel32.FreeLibraryAndExitThread
@ stdcall FreeResource(long) kernel32.FreeResource
diff --git a/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec b/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec
index 9c0bed10f6..eea8f235c8 100644
--- a/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec
+++ b/dlls/api-ms-win-core-libraryloader-l1-1-1/api-ms-win-core-libraryloader-l1-1-1.spec
@@ -7,7 +7,7 @@
@ stub EnumResourceTypesExA
@ stub EnumResourceTypesExW
@ stdcall FindResourceExW(long wstr wstr long) kernel32.FindResourceExW
-@ stub FindStringOrdinal
+@ stdcall FindStringOrdinal(long wstr long wstr long long) kernel32.FindStringOrdinal
@ stdcall FreeLibrary(long) kernel32.FreeLibrary
@ stdcall FreeLibraryAndExitThread(long long) kernel32.FreeLibraryAndExitThread
@ stdcall FreeResource(long) kernel32.FreeResource
diff --git a/dlls/api-ms-win-core-libraryloader-l1-2-0/api-ms-win-core-libraryloader-l1-2-0.spec b/dlls/api-ms-win-core-libraryloader-l1-2-0/api-ms-win-core-libraryloader-l1-2-0.spec
index 7d1fcac9e2..a011bee54f 100644
--- a/dlls/api-ms-win-core-libraryloader-l1-2-0/api-ms-win-core-libraryloader-l1-2-0.spec
+++ b/dlls/api-ms-win-core-libraryloader-l1-2-0/api-ms-win-core-libraryloader-l1-2-0.spec
@@ -7,7 +7,7 @@
@ stub EnumResourceTypesExA
@ stub EnumResourceTypesExW
@ stdcall FindResourceExW(long wstr wstr long) kernel32.FindResourceExW
-@ stub FindStringOrdinal
+@ stdcall FindStringOrdinal(long wstr long wstr long long) kernel32.FindStringOrdinal
@ stdcall FreeLibrary(long) kernel32.FreeLibrary
@ stdcall FreeLibraryAndExitThread(long long) kernel32.FreeLibraryAndExitThread
@ stdcall FreeResource(long) kernel32.FreeResource
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index c38b8f81f5..74af2a4570 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -511,7 +511,7 @@
@ stdcall FindResourceExA(long str str long)
@ stdcall FindResourceExW(long wstr wstr long)
@ stdcall FindResourceW(long wstr wstr)
-# @ stub FindStringOrdinal
+@ stdcall FindStringOrdinal(long wstr long wstr long long)
@ stdcall FindVolumeClose(ptr)
@ stdcall FindVolumeMountPointClose(ptr)
@ stdcall FlsAlloc(ptr)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index 4d1eac6ebe..e62b849d09 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -5999,3 +5999,52 @@ INT WINAPI FindNLSStringEx(const WCHAR *localename, DWORD flags, const WCHAR *sr
return -1;
}
+
+/******************************************************************************
+ * FindStringOrdinal (KERNEL32.@)
+ */
+
+INT WINAPI FindStringOrdinal(DWORD flag, const WCHAR *src, INT src_size, const WCHAR *val, INT val_size,
+ BOOL ignore_case)
+{
+ INT offset, inc, count;
+ TRACE("%#x %s %d %s %d %d\n", flag, wine_dbgstr_w(src), src_size, wine_dbgstr_w(val), val_size, ignore_case);
+
+ if (!src || !val)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return -1;
+ }
+
+ if (flag != FIND_FROMSTART && flag != FIND_FROMEND && flag != FIND_STARTSWITH && flag != FIND_ENDSWITH)
+ {
+ SetLastError(ERROR_INVALID_FLAGS);
+ return -1;
+ }
+
+ if (src_size == -1) src_size = strlenW(src);
+ if (val_size == -1) val_size = strlenW(val);
+
+ src_size -= val_size;
+ if (src_size < 0)
+ {
+ SetLastError(NO_ERROR);
+ return -1;
+ }
+
+ count = flag & (FIND_FROMSTART | FIND_FROMEND) ? src_size + 1 : 1;
+ offset = flag & (FIND_FROMSTART | FIND_STARTSWITH) ? 0 : src_size;
+ inc = flag & (FIND_FROMSTART | FIND_STARTSWITH) ? 1 : -1;
+ while (count--)
+ {
+ if (CompareStringOrdinal(src + offset, val_size, val, val_size, ignore_case) == CSTR_EQUAL)
+ {
+ SetLastError(NO_ERROR);
+ return offset;
+ }
+ offset += inc;
+ }
+
+ SetLastError(NO_ERROR);
+ return -1;
+}
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index d3eb2ecf15..3357d0db9e 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -107,6 +107,7 @@ static INT (WINAPI *pFindNLSStringEx)(LPCWSTR, DWORD, LPCWSTR, INT, LPCWSTR, INT
static LANGID (WINAPI *pSetThreadUILanguage)(LANGID);
static LANGID (WINAPI *pGetThreadUILanguage)(VOID);
static INT (WINAPI *pNormalizeString)(NORM_FORM, LPCWSTR, INT, LPWSTR, INT);
+static INT (WINAPI *pFindStringOrdinal)(DWORD, LPCWSTR lpStringSource, INT, LPCWSTR, INT, BOOL);
static void InitFunctionPointers(void)
{
@@ -143,6 +144,7 @@ static void InitFunctionPointers(void)
X(SetThreadUILanguage);
X(GetThreadUILanguage);
X(NormalizeString);
+ X(FindStringOrdinal);
mod = GetModuleHandleA("ntdll");
X(RtlUpcaseUnicodeChar);
@@ -5496,6 +5498,73 @@ static void test_FindNLSStringEx(void)
}
}
+static void test_FindStringOrdinal(void)
+{
+ static const WCHAR abc123aBcW[] = {'a', 'b', 'c', '1', '2', '3', 'a', 'B', 'c', 0};
+ static const WCHAR abcW[] = {'a', 'b', 'c', 0};
+ static const WCHAR aBcW[] = {'a', 'B', 'c', 0};
+ static const WCHAR aaaW[] = {'a', 'a', 'a', 0};
+ static const struct
+ {
+ DWORD flag;
+ const WCHAR *src;
+ INT src_size;
+ const WCHAR *val;
+ INT val_size;
+ BOOL ignore_case;
+ INT ret;
+ DWORD err;
+ }
+ tests[] =
+ {
+ /* Invalid */
+ {1, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, -1, ERROR_INVALID_FLAGS},
+ {FIND_FROMSTART, NULL, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, -1,
+ ERROR_INVALID_PARAMETER},
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, NULL, ARRAY_SIZE(abcW) - 1, FALSE, -1,
+ ERROR_INVALID_PARAMETER},
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, NULL, 0, FALSE, -1, ERROR_INVALID_PARAMETER},
+ {FIND_FROMSTART, NULL, 0, abcW, ARRAY_SIZE(abcW) - 1, FALSE, -1, ERROR_INVALID_PARAMETER},
+ {FIND_FROMSTART, NULL, 0, NULL, 0, FALSE, -1, ERROR_INVALID_PARAMETER},
+ /* Case-insensitive */
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, 0, NO_ERROR},
+ {FIND_FROMEND, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, 0, NO_ERROR},
+ {FIND_STARTSWITH, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, 0, NO_ERROR},
+ {FIND_ENDSWITH, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, -1, NO_ERROR},
+ /* Case-sensitive */
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, aBcW, ARRAY_SIZE(aBcW) - 1, TRUE, 0, NO_ERROR},
+ {FIND_FROMEND, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, aBcW, ARRAY_SIZE(aBcW) - 1, TRUE, 6, NO_ERROR},
+ {FIND_STARTSWITH, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, aBcW, ARRAY_SIZE(aBcW) - 1, TRUE, 0, NO_ERROR},
+ {FIND_ENDSWITH, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, aBcW, ARRAY_SIZE(aBcW) - 1, TRUE, 6, NO_ERROR},
+ /* Other */
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, aaaW, ARRAY_SIZE(aaaW) - 1, FALSE, -1, NO_ERROR},
+ {FIND_FROMSTART, abc123aBcW, -1, abcW, ARRAY_SIZE(abcW) - 1, FALSE, 0, NO_ERROR},
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, -1, FALSE, 0, NO_ERROR},
+ {FIND_FROMSTART, abc123aBcW, 0, abcW, ARRAY_SIZE(abcW) - 1, FALSE, -1, NO_ERROR},
+ {FIND_FROMSTART, abc123aBcW, ARRAY_SIZE(abc123aBcW) - 1, abcW, 0, FALSE, 0, NO_ERROR},
+ {FIND_FROMSTART, abc123aBcW, 0, abcW, 0, FALSE, 0, NO_ERROR},
+ };
+ INT ret;
+ DWORD err;
+ INT i;
+
+ if (!pFindStringOrdinal)
+ {
+ win_skip("FindStringOrdinal is not available.\n");
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(tests); i++)
+ {
+ SetLastError(0xdeadbeef);
+ ret = pFindStringOrdinal(tests[i].flag, tests[i].src, tests[i].src_size, tests[i].val, tests[i].val_size,
+ tests[i].ignore_case);
+ err = GetLastError();
+ ok(ret == tests[i].ret, "Item %d expected %d, got %d\n", i, tests[i].ret, ret);
+ ok(err == tests[i].err, "Item %d expected %#x, got %#x\n", i, tests[i].err, err);
+ }
+}
+
static void test_SetThreadUILanguage(void)
{
LANGID res;
@@ -5746,6 +5815,7 @@ START_TEST(locale)
test_GetThreadPreferredUILanguages();
test_GetUserPreferredUILanguages();
test_FindNLSStringEx();
+ test_FindStringOrdinal();
test_SetThreadUILanguage();
test_NormalizeString();
/* this requires collation table patch to make it MS compatible */
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index 9e51ae44e0..f3b4fd131f 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -373,7 +373,7 @@
# @ stub FindPackagesByPackageFamily
@ stdcall FindResourceExW(long wstr wstr long) kernel32.FindResourceExW
@ stdcall FindResourceW(long wstr wstr) kernel32.FindResourceW
-@ stub FindStringOrdinal
+@ stdcall FindStringOrdinal(long wstr long wstr long long) kernel32.FindStringOrdinal
@ stdcall FindVolumeClose(ptr) kernel32.FindVolumeClose
@ stdcall FlsAlloc(ptr) kernel32.FlsAlloc
@ stdcall FlsFree(long) kernel32.FlsFree
diff --git a/include/libloaderapi.h b/include/libloaderapi.h
index 8f112a7d60..abb848f6e9 100644
--- a/include/libloaderapi.h
+++ b/include/libloaderapi.h
@@ -28,6 +28,7 @@ typedef void *DLL_DIRECTORY_COOKIE, **PDLL_DIRECTORY_COOKIE;
WINBASEAPI DLL_DIRECTORY_COOKIE WINAPI AddDllDirectory(const WCHAR *);
WINBASEAPI BOOL WINAPI RemoveDllDirectory(DLL_DIRECTORY_COOKIE);
WINBASEAPI BOOL WINAPI SetDefaultDllDirectories(DWORD);
+WINBASEAPI INT WINAPI FindStringOrdinal(DWORD, const WCHAR *, INT, const WCHAR *, INT, BOOL);
#ifdef __cplusplus
}
--
2.19.1
2
1
30 Oct '18
This matches the behaviour of DirectInput8 native and appears to be
required for some games to recognise the mouse and keyboard as
a mouse and keyboard.
Signed-off-by: Brendan McGrath <brendan(a)redmandi.com>
---
Changes since v1:
a) Added the signed-off tag; and
b) Changed the Unicode equivalent to match the ASCII version
This resulted in no more uses of those GUIDs, so I also cleaned up
any reference to them
dlls/dinput/device_private.h | 3 ---
dlls/dinput/dinput_main.c | 6 ++----
dlls/dinput/keyboard.c | 11 +++--------
dlls/dinput/mouse.c | 11 +++--------
4 files changed, 8 insertions(+), 23 deletions(-)
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 52bbec4490..d9e2997eaa 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -114,9 +114,6 @@ typedef struct
LPDIRECTINPUTEFFECT ref;
} effect_list_item;
-extern const GUID DInput_Wine_Keyboard_GUID DECLSPEC_HIDDEN;
-extern const GUID DInput_Wine_Mouse_GUID DECLSPEC_HIDDEN;
-
/* Various debug tools */
extern void _dump_DIPROPHEADER(LPCDIPROPHEADER diph) DECLSPEC_HIDDEN;
extern void _dump_OBJECTINSTANCEA(const DIDEVICEOBJECTINSTANCEA *ddoi) DECLSPEC_HIDDEN;
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 28e192af4e..6ed764e748 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -1747,12 +1747,10 @@ static DWORD WINAPI hook_thread_proc(void *param)
{
if (!dev->acquired || !dev->event_proc) continue;
- if (IsEqualGUID( &dev->guid, &GUID_SysKeyboard ) ||
- IsEqualGUID( &dev->guid, &DInput_Wine_Keyboard_GUID ))
+ if (IsEqualGUID( &dev->guid, &GUID_SysKeyboard ))
kbd_cnt++;
else
- if (IsEqualGUID( &dev->guid, &GUID_SysMouse ) ||
- IsEqualGUID( &dev->guid, &DInput_Wine_Mouse_GUID ))
+ if (IsEqualGUID( &dev->guid, &GUID_SysMouse ))
mice_cnt++;
}
LeaveCriticalSection( &dinput->crit );
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index a64c59c603..642d0c0beb 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -145,10 +145,6 @@ static int KeyboardCallback( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM
return ret;
}
-const GUID DInput_Wine_Keyboard_GUID = { /* 0ab8648a-7735-11d2-8c73-71df54a96441 */
- 0x0ab8648a, 0x7735, 0x11d2, {0x8c, 0x73, 0x71, 0xdf, 0x54, 0xa9, 0x64, 0x41}
-};
-
static DWORD get_keyboard_subtype(void)
{
DWORD kbd_type, kbd_subtype, dev_subtype;
@@ -179,7 +175,7 @@ static void fill_keyboard_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD ver
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysKeyboard;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
@@ -203,7 +199,7 @@ static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysKeyboard;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Keyboard_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysKeyboard;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_KEYBOARD | (subtype << 8);
else
@@ -308,8 +304,7 @@ static HRESULT keyboarddev_create_device(IDirectInputImpl *dinput, REFGUID rguid
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
- if (IsEqualGUID(&GUID_SysKeyboard, rguid) || /* Generic Keyboard */
- IsEqualGUID(&DInput_Wine_Keyboard_GUID, rguid)) /* Wine Keyboard */
+ if (IsEqualGUID(&GUID_SysKeyboard, rguid)) /* Wine Keyboard */
{
SysKeyboardImpl *This;
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 6d3eff5d52..7133359351 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -93,10 +93,6 @@ static inline IDirectInputDevice8W *IDirectInputDevice8W_from_impl(SysMouseImpl
static int dinput_mouse_hook( LPDIRECTINPUTDEVICE8A iface, WPARAM wparam, LPARAM lparam );
-const GUID DInput_Wine_Mouse_GUID = { /* 9e573ed8-7734-11d2-8d4a-23903fb6bdf7 */
- 0x9e573ed8, 0x7734, 0x11d2, {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
-};
-
static void _dump_mouse_state(const DIMOUSESTATE2 *m_state)
{
int i;
@@ -121,7 +117,7 @@ static void fill_mouse_dideviceinstanceA(LPDIDEVICEINSTANCEA lpddi, DWORD versio
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysMouse;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
else
@@ -145,7 +141,7 @@ static void fill_mouse_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD versio
ddi.dwSize = dwSize;
ddi.guidInstance = GUID_SysMouse;/* DInput's GUID */
- ddi.guidProduct = DInput_Wine_Mouse_GUID; /* Vendor's GUID */
+ ddi.guidProduct = GUID_SysMouse;
if (version >= 0x0800)
ddi.dwDevType = DI8DEVTYPE_MOUSE | (DI8DEVTYPEMOUSE_TRADITIONAL << 8);
else
@@ -257,8 +253,7 @@ static HRESULT mousedev_create_device(IDirectInputImpl *dinput, REFGUID rguid, R
TRACE("%p %s %s %p %i\n", dinput, debugstr_guid(rguid), debugstr_guid(riid), pdev, unicode);
*pdev = NULL;
- if (IsEqualGUID(&GUID_SysMouse, rguid) || /* Generic Mouse */
- IsEqualGUID(&DInput_Wine_Mouse_GUID, rguid)) /* Wine Mouse */
+ if (IsEqualGUID(&GUID_SysMouse, rguid)) /* Wine Mouse */
{
SysMouseImpl *This;
--
2.17.1
3
5
[PATCH v3 1/6] oleaut32/tests: Abort earlier if we fail to create a proxy.
by Zebediah Figura 30 Oct '18
by Zebediah Figura 30 Oct '18
30 Oct '18
We are not testing anything meaningful in this case.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/oleaut32/tests/tmarshal.c | 51 +++++++++++++---------------------
1 file changed, 20 insertions(+), 31 deletions(-)
diff --git a/dlls/oleaut32/tests/tmarshal.c b/dlls/oleaut32/tests/tmarshal.c
index 68547f7e98..aab8f2cd34 100644
--- a/dlls/oleaut32/tests/tmarshal.c
+++ b/dlls/oleaut32/tests/tmarshal.c
@@ -35,12 +35,6 @@ static HRESULT (WINAPI *pVarAdd)(LPVARIANT,LPVARIANT,LPVARIANT);
#define ok_ole_success(hr, func) ok(hr == S_OK, #func " failed with error 0x%08x\n", hr)
-#ifdef __i386__
-static const int tmarshal_todo = 0;
-#else
-static const int tmarshal_todo = 1;
-#endif
-
/* ULL suffix is not portable */
#define ULL_CONST(dw1, dw2) ((((ULONGLONG)dw1) << 32) | (ULONGLONG)dw2)
@@ -1436,9 +1430,16 @@ static void test_typelibmarshal(void)
IStream_Seek(pStream, ullZero, STREAM_SEEK_SET, NULL);
hr = CoUnmarshalInterface(pStream, &IID_IKindaEnumWidget, (void **)&pKEW);
- todo_wine_if(tmarshal_todo)
+#ifndef __i386__
+ todo_wine
+#endif
ok_ole_success(hr, CoUnmarshalInterface);
IStream_Release(pStream);
+ if (FAILED(hr))
+ {
+ end_host_object(tid, thread);
+ return;
+ }
hr = IKindaEnumWidget_Next(pKEW, &pWidget);
ok_ole_success(hr, IKindaEnumWidget_Next);
@@ -1463,7 +1464,6 @@ static void test_typelibmarshal(void)
VariantInit(&varresult);
hr = IDispatch_Invoke(pDispatch, DISPID_TM_NAME, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYPUT, &dispparams, &varresult, &excepinfo, NULL);
ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1483,7 +1483,6 @@ static void test_typelibmarshal(void)
VariantInit(&varresult);
hr = IDispatch_Invoke(pDispatch, DISPID_TM_NAME, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL);
ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1615,7 +1614,6 @@ static void test_typelibmarshal(void)
hr = IDispatch_Invoke(pDispatch, DISPID_TM_CLONEDISPATCH, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL);
ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1633,7 +1631,6 @@ static void test_typelibmarshal(void)
hr = IDispatch_Invoke(pDispatch, DISPID_TM_CLONECOCLASS, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL);
ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1650,7 +1647,6 @@ static void test_typelibmarshal(void)
VariantInit(&varresult);
hr = IDispatch_Invoke(pDispatch, DISPID_TM_COCLASS, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
todo_wine ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1670,7 +1666,6 @@ static void test_typelibmarshal(void)
hr = IDispatch_Invoke(pDispatch, DISPID_VALUE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dispparams, &varresult, &excepinfo, NULL);
ok_ole_success(hr, IDispatch_Invoke);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == S_OK,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1726,9 +1721,9 @@ static void test_typelibmarshal(void)
V_I4(&vararg[1]) = 2;
hr = IWidget_VariantCArray(pWidget, 2, vararg);
ok_ole_success(hr, IWidget_VariantCArray);
- todo_wine_if(!tmarshal_todo)
+todo_wine
ok(V_VT(&vararg[0]) == VT_I4 && V_I4(&vararg[0]) == 2, "vararg[0] = %d[%d]\n", V_VT(&vararg[0]), V_I4(&vararg[0]));
- todo_wine_if(!tmarshal_todo)
+todo_wine
ok(V_VT(&vararg[1]) == VT_I4 && V_I4(&vararg[1]) == 3, "vararg[1] = %d[%d]\n", V_VT(&vararg[1]), V_I4(&vararg[1]));
/* call VarArg */
@@ -1799,7 +1794,6 @@ static void test_typelibmarshal(void)
VariantInit(&varresult);
hr = IDispatch_Invoke(pDispatch, DISPID_TM_ERROR, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dispparams, NULL, &excepinfo, NULL);
ok(hr == DISP_E_EXCEPTION, "IDispatch_Invoke should have returned DISP_E_EXCEPTION instead of 0x%08x\n", hr);
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == E_NOTIMPL,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -1826,7 +1820,6 @@ static void test_typelibmarshal(void)
hr = ITypeInfo_Invoke(pTypeInfo, &NonOleAutomation, DISPID_NOA_ERROR, DISPATCH_METHOD, &dispparams, &varresult, &excepinfo, NULL);
ok(hr == DISP_E_EXCEPTION, "ITypeInfo_Invoke should have returned DISP_E_EXCEPTION instead of 0x%08x\n", hr);
ok(V_VT(&varresult) == VT_EMPTY, "V_VT(&varresult) should be VT_EMPTY instead of %d\n", V_VT(&varresult));
- todo_wine_if(tmarshal_todo)
ok(excepinfo.wCode == 0x0 && excepinfo.scode == E_NOTIMPL,
"EXCEPINFO differs from expected: wCode = 0x%x, scode = 0x%08x\n",
excepinfo.wCode, excepinfo.scode);
@@ -2140,8 +2133,16 @@ static void test_external_connection(void)
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoUnmarshalInterface(stream, &IID_ItestDual, (void**)&iface);
- todo_wine_if(tmarshal_todo)
+#ifndef __i386__
+ todo_wine
+#endif
ok(hres == S_OK, "CoUnmarshalInterface failed: %08x\n", hres);
+ if (FAILED(hres))
+ {
+ end_host_object(tid, thread);
+ IStream_Release(stream);
+ return;
+ }
ok(external_connections == 1, "external_connections = %d\n", external_connections);
IStream_Release(stream);
@@ -2149,19 +2150,16 @@ static void test_external_connection(void)
/* Creating a stub for new iface causes new external connection. */
hres = ItestDual_QueryInterface(iface, &IID_ITestSecondDisp, (void**)&second);
- todo_wine_if(tmarshal_todo)
ok(hres == S_OK, "Could not get ITestSecondDisp iface: %08x\n", hres);
todo_wine
ok(external_connections == 2, "external_connections = %d\n", external_connections);
- if (hres == S_OK)
- ITestSecondDisp_Release(second);
+ ITestSecondDisp_Release(second);
todo_wine
ok(external_connections == 2, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
ItestDual_Release(iface);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
end_host_object(tid, thread);
@@ -2173,14 +2171,12 @@ static void test_external_connection(void)
expect_last_release_closes = FALSE;
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 1, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
/* Two separated marshal data are still one external connection. */
@@ -2191,25 +2187,21 @@ static void test_external_connection(void)
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 1, "external_connections = %d\n", external_connections);
hres = CoMarshalInterface(stream2, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 1, "external_connections = %d\n", external_connections);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 1, "external_connections = %d\n", external_connections);
expect_last_release_closes = TRUE;
IStream_Seek(stream2, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream2);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
IStream_Release(stream);
@@ -2221,20 +2213,17 @@ static void test_external_connection(void)
hres = CoMarshalInterface(stream, &IID_ItestDual, (IUnknown*)&TestDual, MSHCTX_INPROC, NULL, MSHLFLAGS_TABLEWEAK);
ok(hres == S_OK, "CoMarshalInterface failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoUnmarshalInterface(stream, &IID_ItestDual, (void**)&iface);
ok(hres == S_OK, "CoUnmarshalInterface failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
ItestDual_Release(iface);
IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
hres = CoReleaseMarshalData(stream);
ok(hres == S_OK, "CoReleaseMarshalData failed: %08x\n", hres);
- todo_wine_if(tmarshal_todo)
ok(external_connections == 0, "external_connections = %d\n", external_connections);
IStream_Release(stream);
--
2.19.1
2
11