Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 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
November 2021
- 83 participants
- 2620 messages
[PATCH vkd3d 5/5] vkd3d-shader/hlsl: Write SM4 sample instructions.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl_sm4.c | 56 ++++++++++++++++++++++++++++++++++--
1 file changed, 54 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index e597425ae..da31d5ae2 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -749,7 +749,7 @@ struct sm4_instruction
{
struct sm4_register reg;
unsigned int swizzle;
- } srcs[2];
+ } srcs[3];
unsigned int src_count;
uint32_t idx[2];
@@ -761,6 +761,7 @@ static unsigned int sm4_swizzle_type(enum vkd3d_sm4_register_type type)
switch (type)
{
case VKD3D_SM4_RT_IMMCONST:
+ case VKD3D_SM4_RT_SAMPLER:
return VKD3D_SM4_SWIZZLE_NONE;
case VKD3D_SM4_RT_CONSTBUFFER:
@@ -790,6 +791,14 @@ static void sm4_register_from_deref(struct hlsl_ctx *ctx, struct sm4_register *r
reg->idx_count = 1;
*writemask = VKD3DSP_WRITEMASK_ALL;
}
+ else if (data_type->type == HLSL_CLASS_OBJECT && data_type->base_type == HLSL_TYPE_SAMPLER)
+ {
+ reg->type = VKD3D_SM4_RT_SAMPLER;
+ reg->dim = VKD3D_SM4_DIMENSION_NONE;
+ reg->idx[0] = var->reg.id;
+ reg->idx_count = 1;
+ *writemask = VKD3DSP_WRITEMASK_ALL;
+ }
else
{
unsigned int offset = hlsl_offset_from_deref(deref) + var->buffer_offset;
@@ -1227,6 +1236,32 @@ static void write_sm4_ld(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buf
write_sm4_instruction(buffer, &instr);
}
+static void write_sm4_sample(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *buffer,
+ const struct hlsl_type *resource_type, const struct hlsl_ir_node *dst,
+ const struct hlsl_deref *resource, const struct hlsl_deref *sampler, const struct hlsl_ir_node *coords)
+{
+ struct sm4_instruction instr;
+ unsigned int writemask;
+
+ memset(&instr, 0, sizeof(instr));
+ instr.opcode = VKD3D_SM4_OP_SAMPLE;
+
+ sm4_register_from_node(&instr.dsts[0].reg, &instr.dsts[0].writemask, dst);
+ instr.dst_count = 1;
+
+ sm4_register_from_node(&instr.srcs[0].reg, &writemask, coords);
+ instr.srcs[0].swizzle = hlsl_swizzle_from_writemask(writemask);
+
+ sm4_register_from_deref(ctx, &instr.srcs[1].reg, &writemask, resource, resource_type);
+ instr.srcs[1].swizzle = hlsl_map_swizzle(hlsl_swizzle_from_writemask(writemask), instr.dsts[0].writemask);
+
+ sm4_register_from_deref(ctx, &instr.srcs[2].reg, &writemask, sampler, sampler->var->data_type);
+
+ instr.src_count = 3;
+
+ write_sm4_instruction(buffer, &instr);
+}
+
static void write_sm4_expr(struct hlsl_ctx *ctx,
struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_expr *expr)
{
@@ -1497,6 +1532,21 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx,
const struct hlsl_type *resource_type = load->resource.var->data_type;
const struct hlsl_ir_node *coords = load->coords.node;
+ if (load->sampler.var)
+ {
+ const struct hlsl_type *sampler_type = load->sampler.var->data_type;
+
+ assert(sampler_type->type == HLSL_CLASS_OBJECT);
+ assert(sampler_type->base_type == HLSL_TYPE_SAMPLER);
+ assert(sampler_type->sampler_dim == HLSL_SAMPLER_DIM_GENERIC);
+
+ if (!load->sampler.var->is_uniform)
+ {
+ hlsl_fixme(ctx, load->node.loc, "Sample using non-uniform sampler variable.");
+ return;
+ }
+ }
+
if (!load->resource.var->is_uniform)
{
hlsl_fixme(ctx, load->node.loc, "Load from non-uniform resource variable.");
@@ -1510,7 +1560,9 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx,
break;
case HLSL_RESOURCE_SAMPLE:
- hlsl_fixme(ctx, load->node.loc, "Resource sample instruction.");
+ if (!load->sampler.var)
+ hlsl_fixme(ctx, load->node.loc, "SM4 combined sample expression.\n");
+ write_sm4_sample(ctx, buffer, resource_type, &load->node, &load->resource, &load->sampler, coords);
break;
}
}
--
2.33.1
Nov. 9, 2021
[PATCH vkd3d 4/5] vkd3d-shader/hlsl: Write SM4 sampler declarations.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl_sm4.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index d48a41d11..e597425ae 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -974,6 +974,20 @@ static void write_sm4_dcl_constant_buffer(struct vkd3d_bytecode_buffer *buffer,
write_sm4_instruction(buffer, &instr);
}
+static void write_sm4_dcl_sampler(struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_var *var)
+{
+ const struct sm4_instruction instr =
+ {
+ .opcode = VKD3D_SM4_OP_DCL_SAMPLER,
+
+ .dsts[0].reg.type = VKD3D_SM4_RT_SAMPLER,
+ .dsts[0].reg.idx = {var->reg.id},
+ .dsts[0].reg.idx_count = 1,
+ .dst_count = 1,
+ };
+ write_sm4_instruction(buffer, &instr);
+}
+
static void write_sm4_dcl_texture(struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_var *var)
{
const struct sm4_instruction instr =
@@ -1647,7 +1661,9 @@ static void write_sm4_shdr(struct hlsl_ctx *ctx,
if (!var->reg.allocated || var->data_type->type != HLSL_CLASS_OBJECT)
continue;
- if (var->data_type->base_type == HLSL_TYPE_TEXTURE)
+ if (var->data_type->base_type == HLSL_TYPE_SAMPLER)
+ write_sm4_dcl_sampler(&buffer, var);
+ else if (var->data_type->base_type == HLSL_TYPE_TEXTURE)
write_sm4_dcl_texture(&buffer, var);
}
--
2.33.1
Nov. 9, 2021
[PATCH vkd3d 3/5] vkd3d-shader/hlsl: Handle samplers in write_sm1_uniform().
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl_sm1.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm1.c b/libs/vkd3d-shader/hlsl_sm1.c
index c3d27eea1..875f521f7 100644
--- a/libs/vkd3d-shader/hlsl_sm1.c
+++ b/libs/vkd3d-shader/hlsl_sm1.c
@@ -352,8 +352,18 @@ static void write_sm1_uniforms(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffe
if (!var->semantic.name && var->reg.allocated)
{
put_u32(buffer, 0); /* name */
- put_u32(buffer, vkd3d_make_u32(D3DXRS_FLOAT4, var->reg.id));
- put_u32(buffer, var->data_type->reg_size / 4);
+ if (var->data_type->type == HLSL_CLASS_OBJECT
+ && (var->data_type->base_type == HLSL_TYPE_SAMPLER
+ || var->data_type->base_type == HLSL_TYPE_TEXTURE))
+ {
+ put_u32(buffer, vkd3d_make_u32(D3DXRS_SAMPLER, var->reg.id));
+ put_u32(buffer, 1);
+ }
+ else
+ {
+ put_u32(buffer, vkd3d_make_u32(D3DXRS_FLOAT4, var->reg.id));
+ put_u32(buffer, var->data_type->reg_size / 4);
+ }
put_u32(buffer, 0); /* type */
put_u32(buffer, 0); /* FIXME: default value */
}
--
2.33.1
Nov. 9, 2021
[PATCH vkd3d 2/5] vkd3d-shader/hlsl: Allocate samplers.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
Yes, this is very similar to the allocation path for textures, and it will be
similar to the allocation path for UAVs. I was unable to deduplicate it in a way
I was happy with...
libs/vkd3d-shader/hlsl_codegen.c | 59 ++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index 24b8205c1..e358bd7c9 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -1202,6 +1202,64 @@ static void allocate_buffers(struct hlsl_ctx *ctx)
}
}
+static const struct hlsl_ir_var *get_reserved_sampler(struct hlsl_ctx *ctx, uint32_t index)
+{
+ const struct hlsl_ir_var *var;
+
+ LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, const struct hlsl_ir_var, extern_entry)
+ {
+ if (var->last_read && var->reg_reservation.type == 's' && var->reg_reservation.index == index)
+ return var;
+ }
+ return NULL;
+}
+
+static void allocate_samplers(struct hlsl_ctx *ctx)
+{
+ struct hlsl_ir_var *var;
+ uint32_t index = 0;
+
+ LIST_FOR_EACH_ENTRY(var, &ctx->extern_vars, struct hlsl_ir_var, extern_entry)
+ {
+ if (!var->last_read || var->data_type->type != HLSL_CLASS_OBJECT
+ || var->data_type->base_type != HLSL_TYPE_SAMPLER)
+ continue;
+
+ if (var->reg_reservation.type == 's')
+ {
+ const struct hlsl_ir_var *reserved_sampler = get_reserved_sampler(ctx, var->reg_reservation.index);
+
+ if (reserved_sampler && reserved_sampler != var)
+ {
+ hlsl_error(ctx, var->loc, VKD3D_SHADER_ERROR_HLSL_OVERLAPPING_RESERVATIONS,
+ "Multiple samplers bound to s%u.", var->reg_reservation.index);
+ hlsl_note(ctx, reserved_sampler->loc, VKD3D_SHADER_LOG_ERROR,
+ "Sampler '%s' is already bound to s%u.", reserved_sampler->name,
+ var->reg_reservation.index);
+ }
+
+ var->reg.id = var->reg_reservation.index;
+ var->reg.allocated = true;
+ TRACE("Allocated reserved %s to s%u.\n", var->name, index);
+ }
+ else if (!var->reg_reservation.type)
+ {
+ while (get_reserved_sampler(ctx, index))
+ ++index;
+
+ var->reg.id = index;
+ var->reg.allocated = true;
+ TRACE("Allocated %s to s%u.\n", var->name, index);
+ ++index;
+ }
+ else
+ {
+ hlsl_error(ctx, var->loc, VKD3D_SHADER_ERROR_HLSL_INVALID_RESERVATION,
+ "Samplers must be bound to register type 's'.");
+ }
+ }
+}
+
static const struct hlsl_ir_var *get_reserved_texture(struct hlsl_ctx *ctx, uint32_t index)
{
const struct hlsl_ir_var *var;
@@ -1379,6 +1437,7 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
allocate_textures(ctx);
}
allocate_semantic_registers(ctx);
+ allocate_samplers(ctx);
if (ctx->result)
return ctx->result;
--
2.33.1
Nov. 9, 2021
[PATCH v4 vkd3d 1/5] vkd3d-shader/hlsl: Avoid hard-coding array sizes in hlsl_type_to_string().
by Zebediah Figura
From: Joshua Ashton <joshua(a)froggi.es>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index c71eac3f1..1eee4278a 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -854,14 +854,14 @@ struct vkd3d_string_buffer *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
{
struct vkd3d_string_buffer *string;
- static const char base_types[HLSL_TYPE_LAST_SCALAR + 1][7] =
- {
- "float",
- "half",
- "double",
- "int",
- "uint",
- "bool",
+ static const char *const base_types[] =
+ {
+ [HLSL_TYPE_FLOAT] = "float",
+ [HLSL_TYPE_HALF] = "half",
+ [HLSL_TYPE_DOUBLE] = "double",
+ [HLSL_TYPE_INT] = "int",
+ [HLSL_TYPE_UINT] = "uint",
+ [HLSL_TYPE_BOOL] = "bool",
};
if (!(string = hlsl_get_string_buffer(ctx)))
@@ -915,7 +915,7 @@ struct vkd3d_string_buffer *hlsl_type_to_string(struct hlsl_ctx *ctx, const stru
case HLSL_CLASS_OBJECT:
{
- static const char dimensions[5][HLSL_SAMPLER_DIM_MAX + 1] =
+ static const char *const dimensions[] =
{
[HLSL_SAMPLER_DIM_1D] = "1D",
[HLSL_SAMPLER_DIM_2D] = "2D",
--
2.33.1
Nov. 9, 2021
[PATCH] kernelbase: Implement AppPolicyGetMediaFoundationCodecLoading.
by Mohamad Al-Jaf
Enables native Windows 10 media foundation libraries to run.
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
.../api-ms-win-appmodel-runtime-l1-1-2.spec | 2 +-
dlls/kernelbase/kernelbase.spec | 2 +-
dlls/kernelbase/main.c | 14 ++++++++++++++
include/appmodel.h | 6 ++++++
4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/dlls/api-ms-win-appmodel-runtime-l1-1-2/api-ms-win-appmodel-runtime-l1-1-2.spec b/dlls/api-ms-win-appmodel-runtime-l1-1-2/api-ms-win-appmodel-runtime-l1-1-2.spec
index 3c1b4058a9f..89fe702bbc2 100644
--- a/dlls/api-ms-win-appmodel-runtime-l1-1-2/api-ms-win-appmodel-runtime-l1-1-2.spec
+++ b/dlls/api-ms-win-appmodel-runtime-l1-1-2/api-ms-win-appmodel-runtime-l1-1-2.spec
@@ -1,7 +1,7 @@
@ stub AppPolicyGetClrCompat
@ stub AppPolicyGetCreateFileAccess
@ stub AppPolicyGetLifecycleManagement
-@ stub AppPolicyGetMediaFoundationCodecLoading
+@ stdcall AppPolicyGetMediaFoundationCodecLoading(ptr ptr) kernelbase.AppPolicyGetMediaFoundationCodecLoading
@ stdcall AppPolicyGetProcessTerminationMethod(ptr ptr) kernelbase.AppPolicyGetProcessTerminationMethod
@ stdcall AppPolicyGetShowDeveloperDiagnostic(ptr ptr) kernelbase.AppPolicyGetShowDeveloperDiagnostic
@ stdcall AppPolicyGetThreadInitializationType(ptr ptr) kernelbase.AppPolicyGetThreadInitializationType
diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec
index dd9f4a8ddce..55208889c35 100644
--- a/dlls/kernelbase/kernelbase.spec
+++ b/dlls/kernelbase/kernelbase.spec
@@ -43,7 +43,7 @@
# @ stub AppPolicyGetClrCompat
# @ stub AppPolicyGetCreateFileAccess
# @ stub AppPolicyGetLifecycleManagement
-# @ stub AppPolicyGetMediaFoundationCodecLoading
+@ stdcall AppPolicyGetMediaFoundationCodecLoading(ptr ptr)
@ stdcall AppPolicyGetProcessTerminationMethod(ptr ptr)
@ stdcall AppPolicyGetShowDeveloperDiagnostic(ptr ptr)
@ stdcall AppPolicyGetThreadInitializationType(ptr ptr)
diff --git a/dlls/kernelbase/main.c b/dlls/kernelbase/main.c
index b90ee1cba2c..e6cf892a4dc 100644
--- a/dlls/kernelbase/main.c
+++ b/dlls/kernelbase/main.c
@@ -88,6 +88,20 @@ INT WINAPI MulDiv( INT a, INT b, INT c )
return ret;
}
+/***********************************************************************
+ * AppPolicyGetMediaFoundationCodecLoading (KERNELBASE.@)
+ */
+
+LONG WINAPI AppPolicyGetMediaFoundationCodecLoading(HANDLE token, AppPolicyMediaFoundationCodecLoading *policy)
+{
+ FIXME("%p, %p\n", token, policy);
+
+ if(policy)
+ *policy = AppPolicyMediaFoundationCodecLoading_All;
+
+ return ERROR_SUCCESS;
+}
+
/***********************************************************************
* AppPolicyGetProcessTerminationMethod (KERNELBASE.@)
*/
diff --git a/include/appmodel.h b/include/appmodel.h
index e4288bbfbb0..cf1b9659d14 100644
--- a/include/appmodel.h
+++ b/include/appmodel.h
@@ -22,6 +22,12 @@
extern "C" {
#endif
+typedef enum AppPolicyMediaFoundationCodecLoading
+{
+ AppPolicyMediaFoundationCodecLoading_All = 0,
+ AppPolicyMediaFoundationCodecLoading_InboxOnly = 1,
+} AppPolicyMediaFoundationCodecLoading;
+
typedef enum AppPolicyProcessTerminationMethod
{
AppPolicyProcessTerminationMethod_ExitProcess = 0,
--
2.33.1
Nov. 9, 2021
[PATCH] wined3d: Parse ISG1, PSG1 and OSG1 signatures.
by Zebediah Figura
These signatures extend the OSG5 format by a minimum precision hint, which gets
ignored for now but could be implemented using 16-bit floats in the future.
Fixes some shader parsing errors in Resident Evil 2.
Based on a vkd3d patch by Philip Rebohle.
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/shader_sm4.c | 21 ++++++++++++++++++---
include/wine/wined3d.h | 1 +
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 4635910269f..005be96a51f 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -1820,10 +1820,13 @@ const struct wined3d_shader_frontend sm4_shader_frontend =
#define TAG_AON9 WINEMAKEFOURCC('A', 'o', 'n', '9')
#define TAG_DXBC WINEMAKEFOURCC('D', 'X', 'B', 'C')
+#define TAG_ISG1 WINEMAKEFOURCC('I', 'S', 'G', '1')
#define TAG_ISGN WINEMAKEFOURCC('I', 'S', 'G', 'N')
+#define TAG_OSG1 WINEMAKEFOURCC('O', 'S', 'G', '1')
#define TAG_OSG5 WINEMAKEFOURCC('O', 'S', 'G', '5')
#define TAG_OSGN WINEMAKEFOURCC('O', 'S', 'G', 'N')
#define TAG_PCSG WINEMAKEFOURCC('P', 'C', 'S', 'G')
+#define TAG_PSG1 WINEMAKEFOURCC('P', 'S', 'G', '1')
#define TAG_SHDR WINEMAKEFOURCC('S', 'H', 'D', 'R')
#define TAG_SHEX WINEMAKEFOURCC('S', 'H', 'E', 'X')
@@ -1955,6 +1958,7 @@ static HRESULT shader_parse_signature(DWORD tag, const char *data, DWORD data_si
struct wined3d_shader_signature *s)
{
struct wined3d_shader_signature_element *e;
+ bool has_stream_index, has_min_precision;
const char *ptr = data;
unsigned int i;
DWORD count;
@@ -1982,11 +1986,14 @@ static HRESULT shader_parse_signature(DWORD tag, const char *data, DWORD data_si
return E_OUTOFMEMORY;
}
+ has_min_precision = tag == TAG_OSG1 || tag == TAG_PSG1 || tag == TAG_ISG1;
+ has_stream_index = tag == TAG_OSG5 || has_min_precision;
+
for (i = 0; i < count; ++i)
{
DWORD name_offset;
- if (tag == TAG_OSG5)
+ if (has_stream_index)
read_dword(&ptr, &e[i].stream_idx);
else
e[i].stream_idx = 0;
@@ -2003,10 +2010,15 @@ static HRESULT shader_parse_signature(DWORD tag, const char *data, DWORD data_si
read_dword(&ptr, &e[i].register_idx);
read_dword(&ptr, &e[i].mask);
+ if (has_min_precision)
+ read_dword(&ptr, &e[i].min_precision);
+ else
+ e[i].min_precision = 0;
+
TRACE("Stream: %u, semantic: %s, semantic idx: %u, sysval_semantic %#x, "
- "type %u, register idx: %u, use_mask %#x, input_mask %#x.\n",
+ "type %u, register idx: %u, use_mask %#x, input_mask %#x, min_precision %u.\n",
e[i].stream_idx, debugstr_a(e[i].semantic_name), e[i].semantic_idx, e[i].sysval_semantic,
- e[i].component_type, e[i].register_idx, (e[i].mask >> 8) & 0xff, e[i].mask & 0xff);
+ e[i].component_type, e[i].register_idx, (e[i].mask >> 8) & 0xff, e[i].mask & 0xff, e[i].min_precision);
}
s->elements = e;
@@ -2024,6 +2036,7 @@ static HRESULT shader_dxbc_chunk_handler(const char *data, DWORD data_size, DWOR
switch (tag)
{
case TAG_ISGN:
+ case TAG_ISG1:
if (ctx->max_version < 4)
{
TRACE("Skipping shader input signature.\n");
@@ -2039,6 +2052,7 @@ static HRESULT shader_dxbc_chunk_handler(const char *data, DWORD data_size, DWOR
break;
case TAG_OSGN:
+ case TAG_OSG1:
case TAG_OSG5:
if (ctx->max_version < 4)
{
@@ -2055,6 +2069,7 @@ static HRESULT shader_dxbc_chunk_handler(const char *data, DWORD data_size, DWOR
break;
case TAG_PCSG:
+ case TAG_PSG1:
if (shader->patch_constant_signature.elements)
{
FIXME("Multiple patch constant signatures.\n");
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 7a6588ea4f4..1fdbd105cc4 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2107,6 +2107,7 @@ struct wined3d_shader_signature_element
enum wined3d_component_type component_type;
unsigned int register_idx;
DWORD mask;
+ unsigned int min_precision;
};
struct wined3d_shader_signature
--
2.33.0
Nov. 9, 2021
Re: [PATCH 1/3] wined3d: Test if an offset is needed to get the correct filling convention (v3).
by Francois Gouget
On Wed, 3 Nov 2021, Marvin wrote:
[...]
> === w1064v1809 (32 bit report) ===
> === w10pro64 (32 bit report) ===
> === debiant2 (32 bit report) ===
[...]
Strange.
I don't see any of these test failures in the WineTest results.
However this patch does cause a todo to reliably succeed on Linux on the
cw-gtx560 machine. But the same todo still fails on all the other
configurations. It would be nice if there was an easy fix but that seems
unlikely :-(
https://test.winehq.org/data/patterns.html#d3drm:d3drm
d3drm.c:7295: Test succeeded inside todo block: Got unexpected color 0x00bada55.
--
Francois Gouget <fgouget(a)codeweavers.com>
Nov. 8, 2021
[PATCH] sechost: Fix hang when a device notification callback tries to register/unregister a notify.
by Brendan Shanks
Fixes 4 second hang in Yooka-Laylee and the Impossible Lair when a
controller is connected.
Signed-off-by: Brendan Shanks <bshanks(a)codeweavers.com>
---
dlls/sechost/service.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/sechost/service.c b/dlls/sechost/service.c
index c447263bd0f..e6f4eb75db0 100644
--- a/dlls/sechost/service.c
+++ b/dlls/sechost/service.c
@@ -1992,9 +1992,11 @@ static DWORD WINAPI device_notify_proc( void *arg )
RPC_WSTR binding_str;
DWORD err = ERROR_SUCCESS;
struct device_notify_registration *registration;
+ struct device_notification_details *details_copy;
+ unsigned int details_copy_nelems, details_copy_size;
plugplay_rpc_handle handle = NULL;
DWORD code = 0;
- unsigned int size;
+ unsigned int i, size;
BYTE *buf;
if ((err = RpcStringBindingComposeW( NULL, protseq, NULL, endpoint, NULL, &binding_str )))
@@ -2026,6 +2028,9 @@ static DWORD WINAPI device_notify_proc( void *arg )
return 1;
}
+ details_copy_size = 8;
+ details_copy = heap_alloc( details_copy_size * sizeof(*details_copy) );
+
for (;;)
{
buf = NULL;
@@ -2046,15 +2051,31 @@ static DWORD WINAPI device_notify_proc( void *arg )
break;
}
+ /* Make a copy to avoid a hang if a callback tries to register or unregister for notifications. */
+ i = 0;
+ details_copy_nelems = 0;
EnterCriticalSection( &service_cs );
LIST_FOR_EACH_ENTRY(registration, &device_notify_list, struct device_notify_registration, entry)
{
- registration->details.cb( registration->details.handle, code, (DEV_BROADCAST_HDR *)buf );
+ details_copy[i++] = registration->details;
+ details_copy_nelems++;
+ if (i == details_copy_size)
+ {
+ details_copy_size *= 2;
+ details_copy = heap_realloc( details_copy, details_copy_size * sizeof(*details_copy) );
+ }
}
LeaveCriticalSection(&service_cs);
+
+ for (i = 0; i < details_copy_nelems; i++)
+ {
+ details_copy[i].cb( details_copy[i].handle, code, (DEV_BROADCAST_HDR *)buf );
+ }
MIDL_user_free(buf);
}
+ heap_free( details_copy );
+
__TRY
{
plugplay_unregister_listener( handle );
--
2.32.0
Nov. 8, 2021
[PATCH v4 6/6] wined3d: Try to allocate new Vulkan BOs from the client thread for DISCARD maps.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/wined3d/adapter_gl.c | 13 +++++++++
dlls/wined3d/adapter_vk.c | 50 ++++++++++++++++++++++++++++++++++
dlls/wined3d/buffer.c | 35 ++++++++++++++++++++++--
dlls/wined3d/cs.c | 13 ++++++++-
dlls/wined3d/directx.c | 12 ++++++++
dlls/wined3d/wined3d_private.h | 11 ++++++++
6 files changed, 131 insertions(+), 3 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 7ec30cb4356..85b40b19896 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -4606,6 +4606,17 @@ static void adapter_gl_flush_bo_address(struct wined3d_context *context,
wined3d_context_gl_flush_bo_address(wined3d_context_gl(context), data, size);
}
+static bool adapter_gl_alloc_bo(struct wined3d_device *device, struct wined3d_resource *resource,
+ unsigned int sub_resource_idx, struct wined3d_bo_address *addr)
+{
+ return false;
+}
+
+static void adapter_gl_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
+{
+ wined3d_context_gl_destroy_bo(wined3d_context_gl(context), wined3d_bo_gl(bo));
+}
+
static HRESULT adapter_gl_create_swapchain(struct wined3d_device *device,
struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
@@ -5059,6 +5070,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_gl_ops =
.adapter_unmap_bo_address = adapter_gl_unmap_bo_address,
.adapter_copy_bo_address = adapter_gl_copy_bo_address,
.adapter_flush_bo_address = adapter_gl_flush_bo_address,
+ .adapter_alloc_bo = adapter_gl_alloc_bo,
+ .adapter_destroy_bo = adapter_gl_destroy_bo,
.adapter_create_swapchain = adapter_gl_create_swapchain,
.adapter_destroy_swapchain = adapter_gl_destroy_swapchain,
.adapter_create_buffer = adapter_gl_create_buffer,
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 62a9a342e9b..e83f0a012d6 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -23,6 +23,7 @@
#include "wine/vulkan_driver.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+WINE_DECLARE_DEBUG_CHANNEL(d3d_perf);
static const struct wined3d_state_entry_template misc_state_template_vk[] =
{
@@ -1216,6 +1217,53 @@ static void adapter_vk_flush_bo_address(struct wined3d_context *context,
flush_bo_range(context_vk, bo, (uintptr_t)data->addr, size);
}
+static bool adapter_vk_alloc_bo(struct wined3d_device *device, struct wined3d_resource *resource,
+ unsigned int sub_resource_idx, struct wined3d_bo_address *addr)
+{
+ struct wined3d_device_vk *device_vk = wined3d_device_vk(device);
+ struct wined3d_context_vk *context_vk = &device_vk->context_vk;
+
+ wined3d_not_from_cs(device->cs);
+ assert(device->context_count);
+
+ if (resource->type == WINED3D_RTYPE_BUFFER)
+ {
+ struct wined3d_bo_vk *bo_vk;
+
+ if (!(bo_vk = heap_alloc(sizeof(*bo_vk))))
+ return false;
+
+ if (!(wined3d_context_vk_create_bo(context_vk, resource->size,
+ vk_buffer_usage_from_bind_flags(resource->bind_flags),
+ vk_memory_type_from_access_flags(resource->access, resource->usage), bo_vk)))
+ {
+ WARN("Failed to create Vulkan buffer.\n");
+ heap_free(bo_vk);
+ return false;
+ }
+
+ if (!bo_vk->b.map_ptr)
+ {
+ WARN_(d3d_perf)("BO %p (chunk %p, slab %p) is not persistently mapped.\n",
+ bo_vk, bo_vk->memory ? bo_vk->memory->chunk : NULL, bo_vk->slab);
+
+ if (!wined3d_bo_vk_map(bo_vk, context_vk))
+ ERR("Failed to map bo.\n");
+ }
+
+ addr->buffer_object = (uintptr_t)bo_vk;
+ addr->addr = NULL;
+ return true;
+ }
+
+ return false;
+}
+
+static void adapter_vk_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
+{
+ wined3d_context_vk_destroy_bo(wined3d_context_vk(context), wined3d_bo_vk(bo));
+}
+
static HRESULT adapter_vk_create_swapchain(struct wined3d_device *device,
struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
@@ -1868,6 +1916,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_vk_ops =
.adapter_unmap_bo_address = adapter_vk_unmap_bo_address,
.adapter_copy_bo_address = adapter_vk_copy_bo_address,
.adapter_flush_bo_address = adapter_vk_flush_bo_address,
+ .adapter_alloc_bo = adapter_vk_alloc_bo,
+ .adapter_destroy_bo = adapter_vk_destroy_bo,
.adapter_create_swapchain = adapter_vk_create_swapchain,
.adapter_destroy_swapchain = adapter_vk_destroy_swapchain,
.adapter_create_buffer = adapter_vk_create_buffer,
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index fca8ab707f2..82890cd8327 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -1069,6 +1069,34 @@ static HRESULT buffer_resource_sub_resource_unmap(struct wined3d_resource *resou
return WINED3D_OK;
}
+static void wined3d_buffer_set_bo(struct wined3d_buffer *buffer, struct wined3d_context *context, struct wined3d_bo *bo)
+{
+ struct wined3d_bo *prev_bo = buffer->buffer_object;
+
+ TRACE("buffer %p, context %p, bo %p.\n", buffer, context, bo);
+
+ if (prev_bo)
+ {
+ struct wined3d_bo_user *bo_user;
+
+ LIST_FOR_EACH_ENTRY(bo_user, &prev_bo->users, struct wined3d_bo_user, entry)
+ bo_user->valid = false;
+ assert(list_empty(&bo->users));
+ list_move_head(&bo->users, &prev_bo->users);
+
+ wined3d_context_destroy_bo(context, prev_bo);
+ heap_free(prev_bo);
+ }
+ else
+ {
+ list_add_head(&bo->users, &buffer->bo_user.entry);
+ }
+
+ buffer->buffer_object = bo;
+ wined3d_buffer_validate_location(buffer, WINED3D_LOCATION_BUFFER);
+ wined3d_buffer_invalidate_location(buffer, ~WINED3D_LOCATION_BUFFER);
+}
+
void wined3d_buffer_copy_bo_address(struct wined3d_buffer *dst_buffer, struct wined3d_context *context,
unsigned int dst_offset, const struct wined3d_const_bo_address *src_addr, unsigned int size)
{
@@ -1104,6 +1132,9 @@ void wined3d_buffer_copy(struct wined3d_buffer *dst_buffer, unsigned int dst_off
void wined3d_buffer_update_sub_resource(struct wined3d_buffer *buffer, struct wined3d_context *context,
const struct upload_bo *upload_bo, unsigned int offset, unsigned int size)
{
+ if (upload_bo->flags & UPLOAD_BO_RENAME_ON_UNMAP)
+ wined3d_buffer_set_bo(buffer, context, (struct wined3d_bo *)upload_bo->addr.buffer_object);
+
if (upload_bo->addr.buffer_object && upload_bo->addr.buffer_object == (uintptr_t)buffer->buffer_object)
wined3d_context_flush_bo_address(context, &upload_bo->addr, size);
else
@@ -1418,7 +1449,7 @@ HRESULT wined3d_buffer_gl_init(struct wined3d_buffer_gl *buffer_gl, struct wined
return wined3d_buffer_init(&buffer_gl->b, device, desc, data, parent, parent_ops, &wined3d_buffer_gl_ops);
}
-static VkBufferUsageFlags vk_buffer_usage_from_bind_flags(uint32_t bind_flags)
+VkBufferUsageFlags vk_buffer_usage_from_bind_flags(uint32_t bind_flags)
{
VkBufferUsageFlags usage;
@@ -1442,7 +1473,7 @@ static VkBufferUsageFlags vk_buffer_usage_from_bind_flags(uint32_t bind_flags)
return usage;
}
-static VkMemoryPropertyFlags vk_memory_type_from_access_flags(uint32_t access, uint32_t usage)
+VkMemoryPropertyFlags vk_memory_type_from_access_flags(uint32_t access, uint32_t usage)
{
VkMemoryPropertyFlags memory_type = 0;
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c
index 1d909e0c706..262123b5d90 100644
--- a/dlls/wined3d/cs.c
+++ b/dlls/wined3d/cs.c
@@ -3116,12 +3116,20 @@ static bool wined3d_cs_map_upload_bo(struct wined3d_device_context *context, str
{
/* Limit NOOVERWRITE maps to buffers for now; there are too many ways that
* a texture can be invalidated to even count. */
- if (wined3d_map_persistent() && resource->type == WINED3D_RTYPE_BUFFER && (flags & WINED3D_MAP_NOOVERWRITE))
+ if (wined3d_map_persistent() && resource->type == WINED3D_RTYPE_BUFFER
+ && (flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)))
{
struct wined3d_client_resource *client = &resource->client;
+ struct wined3d_device *device = context->device;
const struct wined3d_bo *bo;
uint8_t *map_ptr;
+ if (flags & WINED3D_MAP_DISCARD)
+ {
+ if (!device->adapter->adapter_ops->adapter_alloc_bo(device, resource, sub_resource_idx, &client->addr))
+ return false;
+ }
+
bo = (const struct wined3d_bo *)client->addr.buffer_object;
map_ptr = bo ? bo->map_ptr : NULL;
map_ptr += (uintptr_t)client->addr.addr;
@@ -3145,6 +3153,9 @@ static bool wined3d_cs_map_upload_bo(struct wined3d_device_context *context, str
}
map_desc->data = resource_offset_map_pointer(resource, sub_resource_idx, map_ptr, box);
+ if (flags & WINED3D_MAP_DISCARD)
+ client->mapped_upload.flags |= UPLOAD_BO_UPLOAD_ON_UNMAP | UPLOAD_BO_RENAME_ON_UNMAP;
+
client->mapped_box = *box;
TRACE("Returning bo %s, flags %#x.\n", debug_const_bo_address(&client->mapped_upload.addr),
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index c265bdc8c95..06387452b89 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2805,6 +2805,16 @@ static void adapter_no3d_flush_bo_address(struct wined3d_context *context,
{
}
+static bool adapter_no3d_alloc_bo(struct wined3d_device *device, struct wined3d_resource *resource,
+ unsigned int sub_resource_idx, struct wined3d_bo_address *addr)
+{
+ return false;
+}
+
+static void adapter_no3d_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
+{
+}
+
static HRESULT adapter_no3d_create_swapchain(struct wined3d_device *device,
struct wined3d_swapchain_desc *desc, struct wined3d_swapchain_state_parent *state_parent,
void *parent, const struct wined3d_parent_ops *parent_ops, struct wined3d_swapchain **swapchain)
@@ -3075,6 +3085,8 @@ static const struct wined3d_adapter_ops wined3d_adapter_no3d_ops =
.adapter_unmap_bo_address = adapter_no3d_unmap_bo_address,
.adapter_copy_bo_address = adapter_no3d_copy_bo_address,
.adapter_flush_bo_address = adapter_no3d_flush_bo_address,
+ .adapter_alloc_bo = adapter_no3d_alloc_bo,
+ .adapter_destroy_bo = adapter_no3d_destroy_bo,
.adapter_create_swapchain = adapter_no3d_create_swapchain,
.adapter_destroy_swapchain = adapter_no3d_destroy_swapchain,
.adapter_create_buffer = adapter_no3d_create_buffer,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index fc950cda3c3..0c5f7dda228 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -331,6 +331,8 @@ VkPipelineStageFlags vk_pipeline_stage_mask_from_bind_flags(uint32_t bind_flags)
VkShaderStageFlagBits vk_shader_stage_from_wined3d(enum wined3d_shader_type shader_type) DECLSPEC_HIDDEN;
VkAccessFlags vk_access_mask_from_buffer_usage(VkBufferUsageFlags usage) DECLSPEC_HIDDEN;
VkPipelineStageFlags vk_pipeline_stage_mask_from_buffer_usage(VkBufferUsageFlags usage) DECLSPEC_HIDDEN;
+VkBufferUsageFlags vk_buffer_usage_from_bind_flags(uint32_t bind_flags) DECLSPEC_HIDDEN;
+VkMemoryPropertyFlags vk_memory_type_from_access_flags(uint32_t access, uint32_t usage) DECLSPEC_HIDDEN;
static inline enum wined3d_cmp_func wined3d_sanitize_cmp_func(enum wined3d_cmp_func func)
{
@@ -3353,6 +3355,7 @@ bool wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
UINT64 vram_bytes, UINT64 sysmem_bytes) DECLSPEC_HIDDEN;
#define UPLOAD_BO_UPLOAD_ON_UNMAP 0x1
+#define UPLOAD_BO_RENAME_ON_UNMAP 0x2
struct upload_bo
{
@@ -3385,6 +3388,9 @@ struct wined3d_adapter_ops
const struct wined3d_bo_address *dst, const struct wined3d_bo_address *src, size_t size);
void (*adapter_flush_bo_address)(struct wined3d_context *context,
const struct wined3d_const_bo_address *data, size_t size);
+ bool (*adapter_alloc_bo)(struct wined3d_device *device, struct wined3d_resource *resource,
+ unsigned int sub_resource_idx, struct wined3d_bo_address *addr);
+ void (*adapter_destroy_bo)(struct wined3d_context *context, struct wined3d_bo *bo);
HRESULT (*adapter_create_swapchain)(struct wined3d_device *device,
struct wined3d_swapchain_desc *desc,
struct wined3d_swapchain_state_parent *state_parent, void *parent,
@@ -6307,6 +6313,11 @@ static inline void wined3d_context_flush_bo_address(struct wined3d_context *cont
context->device->adapter->adapter_ops->adapter_flush_bo_address(context, data, size);
}
+static inline void wined3d_context_destroy_bo(struct wined3d_context *context, struct wined3d_bo *bo)
+{
+ context->device->adapter->adapter_ops->adapter_destroy_bo(context, bo);
+}
+
static inline void wined3d_context_vk_reference_bo(const struct wined3d_context_vk *context_vk,
struct wined3d_bo_vk *bo)
{
--
2.33.0
Nov. 8, 2021