Wine-Devel
Threads by month
- ----- 2026 -----
- 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
- 2 participants
- 84531 discussions
[PATCH vkd3d 3/5] vkd3d-shader: Store the output buffer in struct vkd3d_d3d_asm_compiler.
by Henri Verbeet Feb. 16, 2021
by Henri Verbeet Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
libs/vkd3d-shader/trace.c | 247 +++++++++++++++++++++++++---------------------
1 file changed, 134 insertions(+), 113 deletions(-)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index 24eadf33..2865fa47 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -302,6 +302,7 @@ shader_input_sysval_semantic_names[] =
struct vkd3d_d3d_asm_compiler
{
+ struct vkd3d_string_buffer buffer;
struct vkd3d_shader_version shader_version;
};
@@ -338,7 +339,7 @@ static unsigned int shader_get_float_offset(enum vkd3d_shader_register_type regi
}
}
-static void shader_dump_global_flags(struct vkd3d_string_buffer *buffer, DWORD global_flags)
+static void shader_dump_global_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t global_flags)
{
unsigned int i;
@@ -360,76 +361,78 @@ static void shader_dump_global_flags(struct vkd3d_string_buffer *buffer, DWORD g
{
if (global_flags & global_flag_info[i].flag)
{
- shader_addline(buffer, "%s", global_flag_info[i].name);
+ vkd3d_string_buffer_printf(&compiler->buffer, "%s", global_flag_info[i].name);
global_flags &= ~global_flag_info[i].flag;
if (global_flags)
- shader_addline(buffer, " | ");
+ vkd3d_string_buffer_printf(&compiler->buffer, " | ");
}
}
if (global_flags)
- shader_addline(buffer, "unknown_flags(%#x)", global_flags);
+ vkd3d_string_buffer_printf(&compiler->buffer, "unknown_flags(%#x)", global_flags);
}
-static void shader_dump_sync_flags(struct vkd3d_string_buffer *buffer, DWORD sync_flags)
+static void shader_dump_sync_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t sync_flags)
{
if (sync_flags & VKD3DSSF_GLOBAL_UAV)
{
- shader_addline(buffer, "_uglobal");
+ vkd3d_string_buffer_printf(&compiler->buffer, "_uglobal");
sync_flags &= ~VKD3DSSF_GLOBAL_UAV;
}
if (sync_flags & VKD3DSSF_GROUP_SHARED_MEMORY)
{
- shader_addline(buffer, "_g");
+ vkd3d_string_buffer_printf(&compiler->buffer, "_g");
sync_flags &= ~VKD3DSSF_GROUP_SHARED_MEMORY;
}
if (sync_flags & VKD3DSSF_THREAD_GROUP)
{
- shader_addline(buffer, "_t");
+ vkd3d_string_buffer_printf(&compiler->buffer, "_t");
sync_flags &= ~VKD3DSSF_THREAD_GROUP;
}
if (sync_flags)
- shader_addline(buffer, "_unknown_flags(%#x)", sync_flags);
+ vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", sync_flags);
}
-static void shader_dump_precise_flags(struct vkd3d_string_buffer *buffer, DWORD flags)
+static void shader_dump_precise_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t flags)
{
if (!(flags & VKD3DSI_PRECISE_XYZW))
return;
- shader_addline(buffer, " [precise");
+ vkd3d_string_buffer_printf(&compiler->buffer, " [precise");
if (flags != VKD3DSI_PRECISE_XYZW)
{
- shader_addline(buffer, "(%s%s%s%s)",
+ vkd3d_string_buffer_printf(&compiler->buffer, "(%s%s%s%s)",
flags & VKD3DSI_PRECISE_X ? "x" : "",
flags & VKD3DSI_PRECISE_Y ? "y" : "",
flags & VKD3DSI_PRECISE_Z ? "z" : "",
flags & VKD3DSI_PRECISE_W ? "w" : "");
}
- shader_addline(buffer, "]");
+ vkd3d_string_buffer_printf(&compiler->buffer, "]");
}
-static void shader_dump_uav_flags(struct vkd3d_string_buffer *buffer, DWORD uav_flags)
+static void shader_dump_uav_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t uav_flags)
{
if (uav_flags & VKD3DSUF_GLOBALLY_COHERENT)
{
- shader_addline(buffer, "_glc");
+ vkd3d_string_buffer_printf(&compiler->buffer, "_glc");
uav_flags &= ~VKD3DSUF_GLOBALLY_COHERENT;
}
if (uav_flags & VKD3DSUF_ORDER_PRESERVING_COUNTER)
{
- shader_addline(buffer, "_opc");
+ vkd3d_string_buffer_printf(&compiler->buffer, "_opc");
uav_flags &= ~VKD3DSUF_ORDER_PRESERVING_COUNTER;
}
if (uav_flags)
- shader_addline(buffer, "_unknown_flags(%#x)", uav_flags);
+ vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", uav_flags);
}
-static void shader_dump_tessellator_domain(struct vkd3d_string_buffer *buffer,
+static void shader_dump_tessellator_domain(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_tessellator_domain domain)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
shader_addline(buffer, "domain_");
switch (domain)
{
@@ -448,9 +451,11 @@ static void shader_dump_tessellator_domain(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_tessellator_output_primitive(struct vkd3d_string_buffer *buffer,
+static void shader_dump_tessellator_output_primitive(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_shader_tessellator_output_primitive output_primitive)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
shader_addline(buffer, "output_");
switch (output_primitive)
{
@@ -472,9 +477,11 @@ static void shader_dump_tessellator_output_primitive(struct vkd3d_string_buffer
}
}
-static void shader_dump_tessellator_partitioning(struct vkd3d_string_buffer *buffer,
+static void shader_dump_tessellator_partitioning(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_shader_tessellator_partitioning partitioning)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
shader_addline(buffer, "partitioning_");
switch (partitioning)
{
@@ -496,7 +503,7 @@ static void shader_dump_tessellator_partitioning(struct vkd3d_string_buffer *buf
}
}
-static void shader_dump_shader_input_sysval_semantic(struct vkd3d_string_buffer *buffer,
+static void shader_dump_shader_input_sysval_semantic(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_shader_input_sysval_semantic semantic)
{
unsigned int i;
@@ -505,15 +512,15 @@ static void shader_dump_shader_input_sysval_semantic(struct vkd3d_string_buffer
{
if (shader_input_sysval_semantic_names[i].sysval_semantic == semantic)
{
- shader_addline(buffer, "%s", shader_input_sysval_semantic_names[i].sysval_name);
+ vkd3d_string_buffer_printf(&compiler->buffer, "%s", shader_input_sysval_semantic_names[i].sysval_name);
return;
}
}
- shader_addline(buffer, "unknown_shader_input_sysval_semantic(%#x)", semantic);
+ vkd3d_string_buffer_printf(&compiler->buffer, "unknown_shader_input_sysval_semantic(%#x)", semantic);
}
-static void shader_dump_resource_type(struct vkd3d_string_buffer *buffer, enum vkd3d_shader_resource_type type)
+static void shader_dump_resource_type(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_resource_type type)
{
static const char *const resource_type_names[] =
{
@@ -531,12 +538,12 @@ static void shader_dump_resource_type(struct vkd3d_string_buffer *buffer, enum v
};
if (type < ARRAY_SIZE(resource_type_names))
- shader_addline(buffer, "%s", resource_type_names[type]);
+ vkd3d_string_buffer_printf(&compiler->buffer, "%s", resource_type_names[type]);
else
- shader_addline(buffer, "unknown");
+ vkd3d_string_buffer_printf(&compiler->buffer, "unknown");
}
-static void shader_dump_data_type(struct vkd3d_string_buffer *buffer, const enum vkd3d_data_type *type)
+static void shader_dump_data_type(struct vkd3d_d3d_asm_compiler *compiler, const enum vkd3d_data_type *type)
{
static const char *const data_type_names[] =
{
@@ -557,7 +564,7 @@ static void shader_dump_data_type(struct vkd3d_string_buffer *buffer, const enum
const char *name;
int i;
- shader_addline(buffer, "(");
+ vkd3d_string_buffer_printf(&compiler->buffer, "(");
for (i = 0; i < 4; i++)
{
@@ -565,15 +572,17 @@ static void shader_dump_data_type(struct vkd3d_string_buffer *buffer, const enum
name = data_type_names[type[i]];
else
name = "unknown";
- shader_addline(buffer, "%s%s", i == 0 ? "" : ",", name);
+ vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", i == 0 ? "" : ",", name);
}
- shader_addline(buffer, ")");
+ vkd3d_string_buffer_printf(&compiler->buffer, ")");
}
static void shader_dump_decl_usage(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_semantic *semantic, unsigned int flags)
+ const struct vkd3d_shader_semantic *semantic, uint32_t flags)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
shader_addline(buffer, "dcl");
if (semantic->resource.reg.reg.type == VKD3DSPR_SAMPLER)
@@ -605,10 +614,10 @@ static void shader_dump_decl_usage(struct vkd3d_d3d_asm_compiler *compiler,
/* non typed UAVs don't go through this code path */
shader_addline(buffer, "_uav_typed_");
- shader_dump_resource_type(buffer, semantic->resource_type);
+ shader_dump_resource_type(compiler, semantic->resource_type);
if (semantic->resource.reg.reg.type == VKD3DSPR_UAV)
- shader_dump_uav_flags(buffer, flags);
- shader_dump_data_type(buffer, semantic->resource_data_type);
+ shader_dump_uav_flags(compiler, flags);
+ shader_dump_data_type(compiler, semantic->resource_data_type);
}
else
{
@@ -688,14 +697,15 @@ static void shader_dump_decl_usage(struct vkd3d_d3d_asm_compiler *compiler,
}
static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_src_param *param);
+ const struct vkd3d_shader_src_param *param);
-static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_register *reg)
+static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+ unsigned int offset = reg->idx[0].offset;
+
static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
static const char * const misctype_reg_names[] = {"vPos", "vFace"};
- unsigned int offset = reg->idx[0].offset;
switch (reg->type)
{
@@ -978,7 +988,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, "[");
if (reg->idx[0].rel_addr)
{
- shader_dump_src_param(compiler, buffer, reg->idx[0].rel_addr);
+ shader_dump_src_param(compiler, reg->idx[0].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u", offset);
@@ -994,7 +1004,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, "[");
if (reg->idx[1].rel_addr)
{
- shader_dump_src_param(compiler, buffer, reg->idx[1].rel_addr);
+ shader_dump_src_param(compiler, reg->idx[1].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u]", reg->idx[1].offset);
@@ -1005,7 +1015,7 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, "[");
if (reg->idx[2].rel_addr)
{
- shader_dump_src_param(compiler, buffer, reg->idx[2].rel_addr);
+ shader_dump_src_param(compiler, reg->idx[2].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u]", reg->idx[2].offset);
@@ -1018,11 +1028,12 @@ static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
}
static void shader_dump_dst_param(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_dst_param *param)
+ const struct vkd3d_shader_dst_param *param)
{
- DWORD write_mask = param->write_mask;
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+ uint32_t write_mask = param->write_mask;
- shader_dump_register(compiler, buffer, ¶m->reg);
+ shader_dump_register(compiler, ¶m->reg);
if (write_mask)
{
@@ -1041,10 +1052,11 @@ static void shader_dump_dst_param(struct vkd3d_d3d_asm_compiler *compiler,
}
static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_src_param *param)
+ const struct vkd3d_shader_src_param *param)
{
enum vkd3d_shader_src_modifier src_modifier = param->modifiers;
- DWORD swizzle = param->swizzle;
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+ uint32_t swizzle = param->swizzle;
if (src_modifier == VKD3DSPSM_NEG
|| src_modifier == VKD3DSPSM_BIASNEG
@@ -1060,7 +1072,7 @@ static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
if (src_modifier == VKD3DSPSM_ABS || src_modifier == VKD3DSPSM_ABSNEG)
shader_addline(buffer, "|");
- shader_dump_register(compiler, buffer, ¶m->reg);
+ shader_dump_register(compiler, ¶m->reg);
switch (src_modifier)
{
@@ -1105,10 +1117,11 @@ static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, "|");
}
-static void shader_dump_ins_modifiers(struct vkd3d_string_buffer *buffer,
+static void shader_dump_ins_modifiers(struct vkd3d_d3d_asm_compiler *compiler,
const struct vkd3d_shader_dst_param *dst)
{
- DWORD mmask = dst->modifiers;
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+ uint32_t mmask = dst->modifiers;
switch (dst->shift)
{
@@ -1130,9 +1143,11 @@ static void shader_dump_ins_modifiers(struct vkd3d_string_buffer *buffer,
if (mmask) FIXME("Unrecognised modifier %#x.\n", mmask);
}
-static void shader_dump_primitive_type(struct vkd3d_string_buffer *buffer,
+static void shader_dump_primitive_type(struct vkd3d_d3d_asm_compiler *compiler,
const struct vkd3d_shader_primitive_type *primitive_type)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
switch (primitive_type->type)
{
case VKD3D_PT_UNDEFINED:
@@ -1177,9 +1192,11 @@ static void shader_dump_primitive_type(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_interpolation_mode(struct vkd3d_string_buffer *buffer,
+static void shader_dump_interpolation_mode(struct vkd3d_d3d_asm_compiler *compiler,
enum vkd3d_shader_interpolation_mode interpolation_mode)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
switch (interpolation_mode)
{
case VKD3DSIM_CONSTANT:
@@ -1247,8 +1264,10 @@ const char *shader_get_type_prefix(enum vkd3d_shader_type type)
}
static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_instruction *ins)
+ const struct vkd3d_shader_instruction *ins)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
+
switch (ins->handler_idx)
{
case VKD3DSIH_BREAKP:
@@ -1298,7 +1317,7 @@ static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compile
break;
case VKD3DSIH_SYNC:
- shader_dump_sync_flags(buffer, ins->flags);
+ shader_dump_sync_flags(compiler, ins->flags);
break;
case VKD3DSIH_TEX:
@@ -1307,42 +1326,42 @@ static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compile
break;
default:
- shader_dump_precise_flags(buffer, ins->flags);
+ shader_dump_precise_flags(compiler, ins->flags);
break;
}
}
-static void shader_dump_register_space(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, unsigned int register_space)
+static void shader_dump_register_space(struct vkd3d_d3d_asm_compiler *compiler, unsigned int register_space)
{
if (shader_ver_ge(&compiler->shader_version, 5, 1))
- shader_addline(buffer, ", space=%u", register_space);
+ vkd3d_string_buffer_printf(&compiler->buffer, ", space=%u", register_space);
}
static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
- struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_instruction *ins)
+ const struct vkd3d_shader_instruction *ins)
{
+ struct vkd3d_string_buffer *buffer = &compiler->buffer;
unsigned int i;
switch (ins->handler_idx)
{
case VKD3DSIH_DCL:
case VKD3DSIH_DCL_UAV_TYPED:
- shader_dump_decl_usage(compiler, buffer, &ins->declaration.semantic, ins->flags);
- shader_dump_ins_modifiers(buffer, &ins->declaration.semantic.resource.reg);
+ shader_dump_decl_usage(compiler, &ins->declaration.semantic, ins->flags);
+ shader_dump_ins_modifiers(compiler, &ins->declaration.semantic.resource.reg);
shader_addline(buffer, " ");
- shader_dump_register(compiler, buffer, &ins->declaration.semantic.resource.reg.reg);
- shader_dump_register_space(compiler, buffer, ins->declaration.semantic.resource.register_space);
+ shader_dump_register(compiler, &ins->declaration.semantic.resource.reg.reg);
+ shader_dump_register_space(compiler, ins->declaration.semantic.resource.register_space);
break;
case VKD3DSIH_DCL_CONSTANT_BUFFER:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_register(compiler, buffer, &ins->declaration.cb.src.reg);
+ shader_dump_register(compiler, &ins->declaration.cb.src.reg);
if (shader_ver_ge(&compiler->shader_version, 5, 1))
shader_addline(buffer, "[%u]", ins->declaration.cb.size);
shader_addline(buffer, ", %s",
ins->flags & VKD3DSI_INDEXED_DYNAMIC ? "dynamicIndexed" : "immediateIndexed");
- shader_dump_register_space(compiler, buffer, ins->declaration.cb.register_space);
+ shader_dump_register_space(compiler, ins->declaration.cb.register_space);
break;
case VKD3DSIH_DCL_FUNCTION_BODY:
@@ -1357,7 +1376,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_GLOBAL_FLAGS:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_global_flags(buffer, ins->flags);
+ shader_dump_global_flags(compiler, ins->flags);
break;
case VKD3DSIH_DCL_HS_MAX_TESSFACTOR:
@@ -1380,7 +1399,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_INDEX_RANGE:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.index_range.dst);
+ shader_dump_dst_param(compiler, &ins->declaration.index_range.dst);
shader_addline(buffer, " %u", ins->declaration.index_range.register_count);
break;
@@ -1393,9 +1412,9 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_INPUT_PS:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_interpolation_mode(buffer, ins->flags);
+ shader_dump_interpolation_mode(compiler, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(compiler, buffer, &ins->declaration.dst);
+ shader_dump_dst_param(compiler, &ins->declaration.dst);
break;
case VKD3DSIH_DCL_INPUT_PS_SGV:
@@ -1403,30 +1422,30 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_INPUT_SIV:
case VKD3DSIH_DCL_OUTPUT_SIV:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.register_semantic.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.register_semantic.reg);
shader_addline(buffer, ", ");
- shader_dump_shader_input_sysval_semantic(buffer, ins->declaration.register_semantic.sysval_semantic);
+ shader_dump_shader_input_sysval_semantic(compiler, ins->declaration.register_semantic.sysval_semantic);
break;
case VKD3DSIH_DCL_INPUT_PS_SIV:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_interpolation_mode(buffer, ins->flags);
+ shader_dump_interpolation_mode(compiler, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(compiler, buffer, &ins->declaration.register_semantic.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.register_semantic.reg);
shader_addline(buffer, ", ");
- shader_dump_shader_input_sysval_semantic(buffer, ins->declaration.register_semantic.sysval_semantic);
+ shader_dump_shader_input_sysval_semantic(compiler, ins->declaration.register_semantic.sysval_semantic);
break;
case VKD3DSIH_DCL_INPUT:
case VKD3DSIH_DCL_OUTPUT:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.dst);
+ shader_dump_dst_param(compiler, &ins->declaration.dst);
break;
case VKD3DSIH_DCL_INPUT_PRIMITIVE:
case VKD3DSIH_DCL_OUTPUT_TOPOLOGY:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_primitive_type(buffer, &ins->declaration.primitive_type);
+ shader_dump_primitive_type(compiler, &ins->declaration.primitive_type);
break;
case VKD3DSIH_DCL_INTERFACE:
@@ -1437,23 +1456,23 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_RESOURCE_RAW:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.raw_resource.resource.reg);
- shader_dump_register_space(compiler, buffer, ins->declaration.raw_resource.resource.register_space);
+ shader_dump_dst_param(compiler, &ins->declaration.raw_resource.resource.reg);
+ shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.register_space);
break;
case VKD3DSIH_DCL_RESOURCE_STRUCTURED:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.structured_resource.resource.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.structured_resource.resource.reg);
shader_addline(buffer, ", %u", ins->declaration.structured_resource.byte_stride);
- shader_dump_register_space(compiler, buffer, ins->declaration.structured_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.register_space);
break;
case VKD3DSIH_DCL_SAMPLER:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_register(compiler, buffer, &ins->declaration.sampler.src.reg);
+ shader_dump_register(compiler, &ins->declaration.sampler.src.reg);
if (ins->flags == VKD3DSI_SAMPLER_COMPARISON_MODE)
shader_addline(buffer, ", comparisonMode");
- shader_dump_register_space(compiler, buffer, ins->declaration.sampler.register_space);
+ shader_dump_register_space(compiler, ins->declaration.sampler.register_space);
break;
case VKD3DSIH_DCL_TEMPS:
@@ -1468,28 +1487,28 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_TESSELLATOR_DOMAIN:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_tessellator_domain(buffer, ins->declaration.tessellator_domain);
+ shader_dump_tessellator_domain(compiler, ins->declaration.tessellator_domain);
break;
case VKD3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_tessellator_output_primitive(buffer, ins->declaration.tessellator_output_primitive);
+ shader_dump_tessellator_output_primitive(compiler, ins->declaration.tessellator_output_primitive);
break;
case VKD3DSIH_DCL_TESSELLATOR_PARTITIONING:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_tessellator_partitioning(buffer, ins->declaration.tessellator_partitioning);
+ shader_dump_tessellator_partitioning(compiler, ins->declaration.tessellator_partitioning);
break;
case VKD3DSIH_DCL_TGSM_RAW:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.tgsm_raw.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.tgsm_raw.reg);
shader_addline(buffer, ", %u", ins->declaration.tgsm_raw.byte_count);
break;
case VKD3DSIH_DCL_TGSM_STRUCTURED:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(compiler, buffer, &ins->declaration.tgsm_structured.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.tgsm_structured.reg);
shader_addline(buffer, ", %u, %u", ins->declaration.tgsm_structured.byte_stride,
ins->declaration.tgsm_structured.structure_count);
break;
@@ -1503,19 +1522,19 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
case VKD3DSIH_DCL_UAV_RAW:
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
- shader_dump_uav_flags(buffer, ins->flags);
+ shader_dump_uav_flags(compiler, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(compiler, buffer, &ins->declaration.raw_resource.resource.reg);
- shader_dump_register_space(compiler, buffer, ins->declaration.raw_resource.resource.register_space);
+ shader_dump_dst_param(compiler, &ins->declaration.raw_resource.resource.reg);
+ shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.register_space);
break;
case VKD3DSIH_DCL_UAV_STRUCTURED:
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
- shader_dump_uav_flags(buffer, ins->flags);
+ shader_dump_uav_flags(compiler, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(compiler, buffer, &ins->declaration.structured_resource.resource.reg);
+ shader_dump_dst_param(compiler, &ins->declaration.structured_resource.resource.reg);
shader_addline(buffer, ", %u", ins->declaration.structured_resource.byte_stride);
- shader_dump_register_space(compiler, buffer, ins->declaration.structured_resource.resource.register_space);
+ shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.register_space);
break;
case VKD3DSIH_DEF:
@@ -1540,7 +1559,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
if (ins->predicate)
{
shader_addline(buffer, "(");
- shader_dump_src_param(compiler, buffer, ins->predicate);
+ shader_dump_src_param(compiler, ins->predicate);
shader_addline(buffer, ") ");
}
@@ -1550,7 +1569,7 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
- shader_dump_instruction_flags(compiler, buffer, ins);
+ shader_dump_instruction_flags(compiler, ins);
if (vkd3d_shader_instruction_has_texel_offset(ins))
{
shader_addline(buffer, "(%d,%d,%d)",
@@ -1560,28 +1579,28 @@ static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
if (ins->resource_type != VKD3D_SHADER_RESOURCE_NONE)
{
shader_addline(buffer, "(");
- shader_dump_resource_type(buffer, ins->resource_type);
+ shader_dump_resource_type(compiler, ins->resource_type);
shader_addline(buffer, ")");
}
- if (ins->resource_data_type[0] != VKD3D_DATA_FLOAT ||
- ins->resource_data_type[1] != VKD3D_DATA_FLOAT ||
- ins->resource_data_type[2] != VKD3D_DATA_FLOAT ||
- ins->resource_data_type[3] != VKD3D_DATA_FLOAT)
- shader_dump_data_type(buffer, ins->resource_data_type);
+ if (ins->resource_data_type[0] != VKD3D_DATA_FLOAT
+ || ins->resource_data_type[1] != VKD3D_DATA_FLOAT
+ || ins->resource_data_type[2] != VKD3D_DATA_FLOAT
+ || ins->resource_data_type[3] != VKD3D_DATA_FLOAT)
+ shader_dump_data_type(compiler, ins->resource_data_type);
for (i = 0; i < ins->dst_count; ++i)
{
- shader_dump_ins_modifiers(buffer, &ins->dst[i]);
+ shader_dump_ins_modifiers(compiler, &ins->dst[i]);
shader_addline(buffer, !i ? " " : ", ");
- shader_dump_dst_param(compiler, buffer, &ins->dst[i]);
+ shader_dump_dst_param(compiler, &ins->dst[i]);
}
/* Other source tokens */
for (i = ins->dst_count; i < (ins->dst_count + ins->src_count); ++i)
{
shader_addline(buffer, !i ? " " : ", ");
- shader_dump_src_param(compiler, buffer, &ins->src[i - ins->dst_count]);
+ shader_dump_src_param(compiler, &ins->src[i - ins->dst_count]);
}
break;
}
@@ -1594,15 +1613,16 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code
struct vkd3d_shader_version *shader_version;
struct vkd3d_d3d_asm_compiler compiler;
enum vkd3d_result result = VKD3D_OK;
- struct vkd3d_string_buffer buffer;
+ struct vkd3d_string_buffer *buffer;
const DWORD *ptr;
void *code;
- vkd3d_string_buffer_init(&buffer);
+ buffer = &compiler.buffer;
+ vkd3d_string_buffer_init(buffer);
shader_version = &compiler.shader_version;
shader_sm4_read_header(data, &ptr, shader_version);
- shader_addline(&buffer, "%s_%u_%u\n",
+ vkd3d_string_buffer_printf(buffer, "%s_%u_%u\n",
shader_get_type_prefix(shader_version->type), shader_version->major, shader_version->minor);
while (!shader_sm4_is_end(data, &ptr))
@@ -1613,25 +1633,26 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code
if (ins.handler_idx == VKD3DSIH_INVALID)
{
WARN("Skipping unrecognized instruction.\n");
- shader_addline(&buffer, "<unrecognized instruction>\n");
+ vkd3d_string_buffer_printf(buffer, "<unrecognized instruction>\n");
result = VKD3D_ERROR;
continue;
}
- shader_dump_instruction(&compiler, &buffer, &ins);
+ shader_dump_instruction(&compiler, &ins);
}
- code = vkd3d_malloc(buffer.content_size);
- if (code)
+ if ((code = vkd3d_malloc(buffer->content_size)))
{
- memcpy(code, buffer.buffer, buffer.content_size);
- out->size = buffer.content_size;
+ memcpy(code, buffer->buffer, buffer->content_size);
+ out->size = buffer->content_size;
out->code = code;
}
else
+ {
result = VKD3D_ERROR_OUT_OF_MEMORY;
+ }
- vkd3d_string_buffer_cleanup(&buffer);
+ vkd3d_string_buffer_cleanup(buffer);
return result;
}
--
2.11.0
1
0
[PATCH vkd3d 2/5] vkd3d-shader: Introduce struct vkd3d_d3d_asm_compiler.
by Henri Verbeet Feb. 16, 2021
by Henri Verbeet Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
libs/vkd3d-shader/trace.c | 138 ++++++++++++++++++++++++----------------------
1 file changed, 72 insertions(+), 66 deletions(-)
diff --git a/libs/vkd3d-shader/trace.c b/libs/vkd3d-shader/trace.c
index 40b3e318..24eadf33 100644
--- a/libs/vkd3d-shader/trace.c
+++ b/libs/vkd3d-shader/trace.c
@@ -300,6 +300,11 @@ shader_input_sysval_semantic_names[] =
{VKD3D_SIV_LINE_DENSITY_TESS_FACTOR, "finalLineDensityTessFactor"},
};
+struct vkd3d_d3d_asm_compiler
+{
+ struct vkd3d_shader_version shader_version;
+};
+
static int shader_ver_ge(const struct vkd3d_shader_version *v, int major, int minor)
{
return v->major > major || (v->major == major && v->minor >= minor);
@@ -566,9 +571,8 @@ static void shader_dump_data_type(struct vkd3d_string_buffer *buffer, const enum
shader_addline(buffer, ")");
}
-static void shader_dump_decl_usage(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_semantic *semantic, unsigned int flags,
- const struct vkd3d_shader_version *shader_version)
+static void shader_dump_decl_usage(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_semantic *semantic, unsigned int flags)
{
shader_addline(buffer, "dcl");
@@ -609,7 +613,8 @@ static void shader_dump_decl_usage(struct vkd3d_string_buffer *buffer,
else
{
/* Pixel shaders 3.0 don't have usage semantics. */
- if (!shader_ver_ge(shader_version, 3, 0) && shader_version->type == VKD3D_SHADER_TYPE_PIXEL)
+ if (!shader_ver_ge(&compiler->shader_version, 3, 0)
+ && compiler->shader_version.type == VKD3D_SHADER_TYPE_PIXEL)
return;
else
shader_addline(buffer, "_");
@@ -682,11 +687,11 @@ static void shader_dump_decl_usage(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_src_param(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_src_param *param, const struct vkd3d_shader_version *shader_version);
+static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_src_param *param);
-static void shader_dump_register(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_register *reg, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_register(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_register *reg)
{
static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"};
static const char * const misctype_reg_names[] = {"vPos", "vFace"};
@@ -711,7 +716,8 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
break;
case VKD3DSPR_TEXTURE: /* vs: case VKD3DSPR_ADDR */
- shader_addline(buffer, "%c", shader_version->type == VKD3D_SHADER_TYPE_PIXEL ? 't' : 'a');
+ vkd3d_string_buffer_printf(buffer, "%c",
+ compiler->shader_version.type == VKD3D_SHADER_TYPE_PIXEL ? 't' : 'a');
break;
case VKD3DSPR_RASTOUT:
@@ -720,7 +726,7 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
case VKD3DSPR_COLOROUT:
shader_addline(buffer, "o");
- if (!shader_ver_ge(shader_version, 4, 0))
+ if (!shader_ver_ge(&compiler->shader_version, 4, 0))
shader_addline(buffer, "C");
break;
@@ -743,7 +749,7 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
case VKD3DSPR_TEXCRDOUT:
/* Vertex shaders >= 3.0 use general purpose output registers
* (VKD3DSPR_OUTPUT), which can include an address token. */
- if (shader_ver_ge(shader_version, 3, 0))
+ if (shader_ver_ge(&compiler->shader_version, 3, 0))
shader_addline(buffer, "o");
else
shader_addline(buffer, "oT");
@@ -964,15 +970,15 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
bool printbrackets = reg->idx[0].rel_addr
|| reg->type == VKD3DSPR_INCONTROLPOINT
|| reg->type == VKD3DSPR_IMMCONSTBUFFER
- || ((shader_version->type == VKD3D_SHADER_TYPE_GEOMETRY
- || shader_version->type == VKD3D_SHADER_TYPE_HULL)
+ || ((compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY
+ || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL)
&& reg->type == VKD3DSPR_INPUT);
if (printbrackets)
shader_addline(buffer, "[");
if (reg->idx[0].rel_addr)
{
- shader_dump_src_param(buffer, reg->idx[0].rel_addr, shader_version);
+ shader_dump_src_param(compiler, buffer, reg->idx[0].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u", offset);
@@ -983,12 +989,12 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
* to normalise it with 5.1.
* Here we should ignore it if it's a CB in sm < 5.1. */
if (reg->idx[1].offset != ~0u &&
- (reg->type != VKD3DSPR_CONSTBUFFER || shader_ver_ge(shader_version, 5, 1)))
+ (reg->type != VKD3DSPR_CONSTBUFFER || shader_ver_ge(&compiler->shader_version, 5, 1)))
{
shader_addline(buffer, "[");
if (reg->idx[1].rel_addr)
{
- shader_dump_src_param(buffer, reg->idx[1].rel_addr, shader_version);
+ shader_dump_src_param(compiler, buffer, reg->idx[1].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u]", reg->idx[1].offset);
@@ -999,7 +1005,7 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "[");
if (reg->idx[2].rel_addr)
{
- shader_dump_src_param(buffer, reg->idx[2].rel_addr, shader_version);
+ shader_dump_src_param(compiler, buffer, reg->idx[2].rel_addr);
shader_addline(buffer, " + ");
}
shader_addline(buffer, "%u]", reg->idx[2].offset);
@@ -1011,12 +1017,12 @@ static void shader_dump_register(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_dst_param(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_dst_param *param, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_dst_param(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_dst_param *param)
{
DWORD write_mask = param->write_mask;
- shader_dump_register(buffer, ¶m->reg, shader_version);
+ shader_dump_register(compiler, buffer, ¶m->reg);
if (write_mask)
{
@@ -1034,8 +1040,8 @@ static void shader_dump_dst_param(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_src_param(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_src_param *param, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_src_param(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_src_param *param)
{
enum vkd3d_shader_src_modifier src_modifier = param->modifiers;
DWORD swizzle = param->swizzle;
@@ -1054,7 +1060,7 @@ static void shader_dump_src_param(struct vkd3d_string_buffer *buffer,
if (src_modifier == VKD3DSPSM_ABS || src_modifier == VKD3DSPSM_ABSNEG)
shader_addline(buffer, "|");
- shader_dump_register(buffer, ¶m->reg, shader_version);
+ shader_dump_register(compiler, buffer, ¶m->reg);
switch (src_modifier)
{
@@ -1240,8 +1246,8 @@ const char *shader_get_type_prefix(enum vkd3d_shader_type type)
}
}
-static void shader_dump_instruction_flags(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_instruction *ins)
{
switch (ins->handler_idx)
{
@@ -1296,7 +1302,7 @@ static void shader_dump_instruction_flags(struct vkd3d_string_buffer *buffer,
break;
case VKD3DSIH_TEX:
- if (shader_ver_ge(shader_version, 2, 0) && (ins->flags & VKD3DSI_TEXLD_PROJECT))
+ if (shader_ver_ge(&compiler->shader_version, 2, 0) && (ins->flags & VKD3DSI_TEXLD_PROJECT))
shader_addline(buffer, "p");
break;
@@ -1306,15 +1312,15 @@ static void shader_dump_instruction_flags(struct vkd3d_string_buffer *buffer,
}
}
-static void shader_dump_register_space(struct vkd3d_string_buffer *buffer,
- unsigned int register_space, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_register_space(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, unsigned int register_space)
{
- if (shader_ver_ge(shader_version, 5, 1))
+ if (shader_ver_ge(&compiler->shader_version, 5, 1))
shader_addline(buffer, ", space=%u", register_space);
}
-static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
- const struct vkd3d_shader_instruction *ins, const struct vkd3d_shader_version *shader_version)
+static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler,
+ struct vkd3d_string_buffer *buffer, const struct vkd3d_shader_instruction *ins)
{
unsigned int i;
@@ -1322,21 +1328,21 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
{
case VKD3DSIH_DCL:
case VKD3DSIH_DCL_UAV_TYPED:
- shader_dump_decl_usage(buffer, &ins->declaration.semantic, ins->flags, shader_version);
+ shader_dump_decl_usage(compiler, buffer, &ins->declaration.semantic, ins->flags);
shader_dump_ins_modifiers(buffer, &ins->declaration.semantic.resource.reg);
shader_addline(buffer, " ");
- shader_dump_register(buffer, &ins->declaration.semantic.resource.reg.reg, shader_version);
- shader_dump_register_space(buffer, ins->declaration.semantic.resource.register_space, shader_version);
+ shader_dump_register(compiler, buffer, &ins->declaration.semantic.resource.reg.reg);
+ shader_dump_register_space(compiler, buffer, ins->declaration.semantic.resource.register_space);
break;
case VKD3DSIH_DCL_CONSTANT_BUFFER:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_register(buffer, &ins->declaration.cb.src.reg, shader_version);
- if (shader_ver_ge(shader_version, 5, 1))
+ shader_dump_register(compiler, buffer, &ins->declaration.cb.src.reg);
+ if (shader_ver_ge(&compiler->shader_version, 5, 1))
shader_addline(buffer, "[%u]", ins->declaration.cb.size);
shader_addline(buffer, ", %s",
ins->flags & VKD3DSI_INDEXED_DYNAMIC ? "dynamicIndexed" : "immediateIndexed");
- shader_dump_register_space(buffer, ins->declaration.cb.register_space, shader_version);
+ shader_dump_register_space(compiler, buffer, ins->declaration.cb.register_space);
break;
case VKD3DSIH_DCL_FUNCTION_BODY:
@@ -1374,7 +1380,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DCL_INDEX_RANGE:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.index_range.dst, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.index_range.dst);
shader_addline(buffer, " %u", ins->declaration.index_range.register_count);
break;
@@ -1389,7 +1395,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
shader_dump_interpolation_mode(buffer, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(buffer, &ins->declaration.dst, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.dst);
break;
case VKD3DSIH_DCL_INPUT_PS_SGV:
@@ -1397,7 +1403,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DCL_INPUT_SIV:
case VKD3DSIH_DCL_OUTPUT_SIV:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.register_semantic.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.register_semantic.reg);
shader_addline(buffer, ", ");
shader_dump_shader_input_sysval_semantic(buffer, ins->declaration.register_semantic.sysval_semantic);
break;
@@ -1406,7 +1412,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
shader_dump_interpolation_mode(buffer, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(buffer, &ins->declaration.register_semantic.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.register_semantic.reg);
shader_addline(buffer, ", ");
shader_dump_shader_input_sysval_semantic(buffer, ins->declaration.register_semantic.sysval_semantic);
break;
@@ -1414,7 +1420,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DCL_INPUT:
case VKD3DSIH_DCL_OUTPUT:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.dst, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.dst);
break;
case VKD3DSIH_DCL_INPUT_PRIMITIVE:
@@ -1431,24 +1437,23 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DCL_RESOURCE_RAW:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.raw_resource.resource.reg, shader_version);
- shader_dump_register_space(buffer, ins->declaration.raw_resource.resource.register_space, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.raw_resource.resource.reg);
+ shader_dump_register_space(compiler, buffer, ins->declaration.raw_resource.resource.register_space);
break;
case VKD3DSIH_DCL_RESOURCE_STRUCTURED:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.structured_resource.resource.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.structured_resource.resource.reg);
shader_addline(buffer, ", %u", ins->declaration.structured_resource.byte_stride);
- shader_dump_register_space(buffer,
- ins->declaration.structured_resource.resource.register_space, shader_version);
+ shader_dump_register_space(compiler, buffer, ins->declaration.structured_resource.resource.register_space);
break;
case VKD3DSIH_DCL_SAMPLER:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_register(buffer, &ins->declaration.sampler.src.reg, shader_version);
+ shader_dump_register(compiler, buffer, &ins->declaration.sampler.src.reg);
if (ins->flags == VKD3DSI_SAMPLER_COMPARISON_MODE)
shader_addline(buffer, ", comparisonMode");
- shader_dump_register_space(buffer, ins->declaration.sampler.register_space, shader_version);
+ shader_dump_register_space(compiler, buffer, ins->declaration.sampler.register_space);
break;
case VKD3DSIH_DCL_TEMPS:
@@ -1478,13 +1483,13 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
case VKD3DSIH_DCL_TGSM_RAW:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.tgsm_raw.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.tgsm_raw.reg);
shader_addline(buffer, ", %u", ins->declaration.tgsm_raw.byte_count);
break;
case VKD3DSIH_DCL_TGSM_STRUCTURED:
shader_addline(buffer, "%s ", shader_opcode_names[ins->handler_idx]);
- shader_dump_dst_param(buffer, &ins->declaration.tgsm_structured.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.tgsm_structured.reg);
shader_addline(buffer, ", %u, %u", ins->declaration.tgsm_structured.byte_stride,
ins->declaration.tgsm_structured.structure_count);
break;
@@ -1500,18 +1505,17 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
shader_dump_uav_flags(buffer, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(buffer, &ins->declaration.raw_resource.resource.reg, shader_version);
- shader_dump_register_space(buffer, ins->declaration.raw_resource.resource.register_space, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.raw_resource.resource.reg);
+ shader_dump_register_space(compiler, buffer, ins->declaration.raw_resource.resource.register_space);
break;
case VKD3DSIH_DCL_UAV_STRUCTURED:
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
shader_dump_uav_flags(buffer, ins->flags);
shader_addline(buffer, " ");
- shader_dump_dst_param(buffer, &ins->declaration.structured_resource.resource.reg, shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->declaration.structured_resource.resource.reg);
shader_addline(buffer, ", %u", ins->declaration.structured_resource.byte_stride);
- shader_dump_register_space(buffer,
- ins->declaration.structured_resource.resource.register_space, shader_version);
+ shader_dump_register_space(compiler, buffer, ins->declaration.structured_resource.resource.register_space);
break;
case VKD3DSIH_DEF:
@@ -1536,7 +1540,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
if (ins->predicate)
{
shader_addline(buffer, "(");
- shader_dump_src_param(buffer, ins->predicate, shader_version);
+ shader_dump_src_param(compiler, buffer, ins->predicate);
shader_addline(buffer, ") ");
}
@@ -1546,7 +1550,7 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
shader_addline(buffer, "%s", shader_opcode_names[ins->handler_idx]);
- shader_dump_instruction_flags(buffer, ins, shader_version);
+ shader_dump_instruction_flags(compiler, buffer, ins);
if (vkd3d_shader_instruction_has_texel_offset(ins))
{
shader_addline(buffer, "(%d,%d,%d)",
@@ -1570,14 +1574,14 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
{
shader_dump_ins_modifiers(buffer, &ins->dst[i]);
shader_addline(buffer, !i ? " " : ", ");
- shader_dump_dst_param(buffer, &ins->dst[i], shader_version);
+ shader_dump_dst_param(compiler, buffer, &ins->dst[i]);
}
/* Other source tokens */
for (i = ins->dst_count; i < (ins->dst_count + ins->src_count); ++i)
{
shader_addline(buffer, !i ? " " : ", ");
- shader_dump_src_param(buffer, &ins->src[i - ins->dst_count], shader_version);
+ shader_dump_src_param(compiler, buffer, &ins->src[i - ins->dst_count]);
}
break;
}
@@ -1587,17 +1591,19 @@ static void shader_dump_instruction(struct vkd3d_string_buffer *buffer,
enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code *out)
{
- struct vkd3d_shader_version shader_version;
- const DWORD *ptr;
- struct vkd3d_string_buffer buffer;
+ struct vkd3d_shader_version *shader_version;
+ struct vkd3d_d3d_asm_compiler compiler;
enum vkd3d_result result = VKD3D_OK;
+ struct vkd3d_string_buffer buffer;
+ const DWORD *ptr;
void *code;
vkd3d_string_buffer_init(&buffer);
- shader_sm4_read_header(data, &ptr, &shader_version);
+ shader_version = &compiler.shader_version;
+ shader_sm4_read_header(data, &ptr, shader_version);
shader_addline(&buffer, "%s_%u_%u\n",
- shader_get_type_prefix(shader_version.type), shader_version.major, shader_version.minor);
+ shader_get_type_prefix(shader_version->type), shader_version->major, shader_version->minor);
while (!shader_sm4_is_end(data, &ptr))
{
@@ -1612,7 +1618,7 @@ enum vkd3d_result vkd3d_dxbc_binary_to_text(void *data, struct vkd3d_shader_code
continue;
}
- shader_dump_instruction(&buffer, &ins, &shader_version);
+ shader_dump_instruction(&compiler, &buffer, &ins);
}
code = vkd3d_malloc(buffer.content_size);
--
2.11.0
1
0
[PATCH vkd3d 1/5] vkd3d-shader: Rename VKD3D_SHADER_INSTRUCTION_HANDLER to vkd3d_shader_opcode.
by Henri Verbeet Feb. 16, 2021
by Henri Verbeet Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
libs/vkd3d-shader/dxbc.c | 2 +-
libs/vkd3d-shader/spirv.c | 14 +++++++-------
libs/vkd3d-shader/vkd3d_shader_main.c | 4 ++--
libs/vkd3d-shader/vkd3d_shader_private.h | 4 ++--
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 278912d8..5b562599 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -481,7 +481,7 @@ struct vkd3d_sm4_data
struct vkd3d_sm4_opcode_info
{
enum vkd3d_sm4_opcode opcode;
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
const char *dst_info;
const char *src_info;
void (*read_opcode_func)(struct vkd3d_shader_instruction *ins,
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index 148115a8..b0b23991 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2131,7 +2131,7 @@ struct vkd3d_push_constant_buffer_binding
struct vkd3d_shader_phase
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER type;
+ enum vkd3d_shader_opcode type;
unsigned int idx;
unsigned int instance_count;
uint32_t function_id;
@@ -6417,7 +6417,7 @@ static SpvOp vkd3d_dxbc_compiler_map_alu_instruction(const struct vkd3d_shader_i
{
static const struct
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
SpvOp spirv_op;
}
alu_ops[] =
@@ -6491,7 +6491,7 @@ static enum GLSLstd450 vkd3d_dxbc_compiler_map_ext_glsl_instruction(
{
static const struct
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
enum GLSLstd450 glsl_inst;
}
glsl_insts[] =
@@ -7514,7 +7514,7 @@ static void vkd3d_dxbc_compiler_emit_deriv_instruction(struct vkd3d_dxbc_compile
static const struct instruction_info
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
SpvOp op;
bool needs_derivative_control;
}
@@ -8402,7 +8402,7 @@ static SpvOp vkd3d_dxbc_compiler_map_atomic_instruction(const struct vkd3d_shade
{
static const struct
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
SpvOp spirv_op;
}
atomic_ops[] =
@@ -8438,7 +8438,7 @@ static SpvOp vkd3d_dxbc_compiler_map_atomic_instruction(const struct vkd3d_shade
return SpvOpMax;
}
-static bool is_imm_atomic_instruction(enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx)
+static bool is_imm_atomic_instruction(enum vkd3d_shader_opcode handler_idx)
{
return VKD3DSIH_IMM_ATOMIC_ALLOC <= handler_idx && handler_idx <= VKD3DSIH_IMM_ATOMIC_XOR;
}
@@ -9029,7 +9029,7 @@ static void vkd3d_dxbc_compiler_emit_main_prolog(struct vkd3d_dxbc_compiler *com
vkd3d_dxbc_compiler_emit_hull_shader_inputs(compiler);
}
-static bool is_dcl_instruction(enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx)
+static bool is_dcl_instruction(enum vkd3d_shader_opcode handler_idx)
{
return (VKD3DSIH_DCL <= handler_idx && handler_idx <= VKD3DSIH_DCL_VERTICES_OUT)
|| handler_idx == VKD3DSIH_HS_DECLS;
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index ff917dbf..c1306cac 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -460,7 +460,7 @@ static struct vkd3d_shader_descriptor_info *vkd3d_shader_scan_get_uav_descriptor
static bool vkd3d_shader_instruction_is_uav_read(const struct vkd3d_shader_instruction *instruction)
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx = instruction->handler_idx;
+ enum vkd3d_shader_opcode handler_idx = instruction->handler_idx;
return (VKD3DSIH_ATOMIC_AND <= handler_idx && handler_idx <= VKD3DSIH_ATOMIC_XOR)
|| (VKD3DSIH_IMM_ATOMIC_ALLOC <= handler_idx && handler_idx <= VKD3DSIH_IMM_ATOMIC_XOR)
|| handler_idx == VKD3DSIH_LD_UAV_TYPED
@@ -482,7 +482,7 @@ static void vkd3d_shader_scan_record_uav_read(struct vkd3d_shader_scan_context *
static bool vkd3d_shader_instruction_is_uav_counter(const struct vkd3d_shader_instruction *instruction)
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx = instruction->handler_idx;
+ enum vkd3d_shader_opcode handler_idx = instruction->handler_idx;
return handler_idx == VKD3DSIH_IMM_ATOMIC_ALLOC
|| handler_idx == VKD3DSIH_IMM_ATOMIC_CONSUME;
}
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 01ad0872..19758481 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -93,7 +93,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_WARNING_PP_DIV_BY_ZERO = 4306,
};
-enum VKD3D_SHADER_INSTRUCTION_HANDLER
+enum vkd3d_shader_opcode
{
VKD3DSIH_ABS,
VKD3DSIH_ADD,
@@ -779,7 +779,7 @@ struct vkd3d_shader_primitive_type
struct vkd3d_shader_instruction
{
- enum VKD3D_SHADER_INSTRUCTION_HANDLER handler_idx;
+ enum vkd3d_shader_opcode handler_idx;
DWORD flags;
unsigned int dst_count;
unsigned int src_count;
--
2.11.0
1
0
[PATCH v3 19/19] ntdll: Use syscall frames for x86_64 NtSetContextThread implementation.
by Jacek Caban Feb. 16, 2021
by Jacek Caban Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
v3: Preserve current NtContinue handling of ContextFlags.
dlls/ntdll/unix/server.c | 5 ++++-
dlls/ntdll/unix/signal_arm.c | 10 ++++++++++
dlls/ntdll/unix/signal_arm64.c | 10 ++++++++++
dlls/ntdll/unix/signal_i386.c | 11 +++++++++++
dlls/ntdll/unix/signal_x86_64.c | 21 ++++++++++++++++-----
dlls/ntdll/unix/unix_private.h | 1 +
tools/winebuild/import.c | 13 ++++++++++++-
7 files changed, 64 insertions(+), 7 deletions(-)
1
0
[PATCH vkd3d 1/5] vkd3d-shader: Replace "parse_status" with a boolean variable.
by Zebediah Figura Feb. 16, 2021
by Zebediah Figura Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl.c | 4 +---
libs/vkd3d-shader/hlsl.h | 17 +----------------
libs/vkd3d-shader/hlsl.y | 6 +++---
3 files changed, 5 insertions(+), 22 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index a129e847..4151c84b 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -35,14 +35,12 @@ void hlsl_error(struct hlsl_ctx *ctx, const struct vkd3d_shader_location loc, co
{
/* FIXME */
- set_parse_status(&ctx->status, PARSE_ERR);
+ ctx->failed = true;
}
void hlsl_warning(struct hlsl_ctx *ctx, const struct vkd3d_shader_location loc, const char *fmt, ...)
{
/* FIXME */
-
- set_parse_status(&ctx->status, PARSE_WARN);
}
bool hlsl_add_var(struct hlsl_ctx *ctx, struct hlsl_ir_var *decl, bool local_var)
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index 067aae86..88e7df5e 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -23,13 +23,6 @@
#include "vkd3d_shader_private.h"
#include "rbtree.h"
-enum parse_status
-{
- PARSE_SUCCESS = 0,
- PARSE_WARN = 1,
- PARSE_ERR = 2
-};
-
/* The general IR structure is inspired by Mesa GLSL hir, even though the code
* ends up being quite different in practice. Anyway, here comes the relevant
* licensing information.
@@ -396,8 +389,8 @@ struct hlsl_ctx
const char **source_files;
unsigned int source_files_count;
struct vkd3d_shader_location location;
- enum parse_status status;
struct vkd3d_shader_message_context *message_context;
+ bool failed;
void *scanner;
@@ -501,14 +494,6 @@ static inline void hlsl_src_remove(struct hlsl_src *src)
src->node = NULL;
}
-static inline void set_parse_status(enum parse_status *current, enum parse_status update)
-{
- if (update == PARSE_ERR)
- *current = PARSE_ERR;
- else if (update == PARSE_WARN && *current == PARSE_SUCCESS)
- *current = PARSE_WARN;
-}
-
const char *hlsl_base_type_to_string(const struct hlsl_type *type) DECLSPEC_HIDDEN;
const char *debug_hlsl_type(const struct hlsl_type *type) DECLSPEC_HIDDEN;
const char *hlsl_debug_modifiers(DWORD modifiers) DECLSPEC_HIDDEN;
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index d7201f58..2fda89e9 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -2006,7 +2006,7 @@ param_list:
if (!add_func_parameter(ctx, $$, &$1, @1))
{
ERR("Error adding function parameter %s.\n", $1.name);
- set_parse_status(&ctx->status, PARSE_ERR);
+ ctx->failed = true;
YYABORT;
}
}
@@ -3111,7 +3111,7 @@ int hlsl_parser_compile(struct hlsl_ctx *ctx, const char *entrypoint)
yyparse(ctx->scanner, ctx);
- if (ctx->status == PARSE_ERR)
+ if (ctx->failed)
return VKD3D_ERROR_INVALID_SHADER;
if (!(entry_func = get_func_entry(ctx, entrypoint)))
@@ -3140,7 +3140,7 @@ int hlsl_parser_compile(struct hlsl_ctx *ctx, const char *entrypoint)
compute_liveness(ctx, entry_func);
- if (ctx->status == PARSE_ERR)
+ if (ctx->failed)
return VKD3D_ERROR_INVALID_SHADER;
return VKD3D_ERROR_NOT_IMPLEMENTED;
}
--
2.30.0
4
15
[v2 PATCH 4/4] dwrite: Always initialize output glyph count in GetGlyphs().
by Nikolay Sivov Feb. 16, 2021
by Nikolay Sivov Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
v2: dropped the test for now, to avoid testing seemingly uninitialized value that Vista returns there.
dlls/dwrite/analyzer.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 53fb18df4c9..d0d769cb346 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -1188,6 +1188,8 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface,
context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos));
context.table = &context.cache->gsub;
+ *actual_glyph_count = 0;
+
scriptprops = &dwritescripts_properties[context.script];
hr = shape_get_glyphs(&context, scriptprops->scripttags);
if (SUCCEEDED(hr))
--
2.30.0
1
0
[PATCH v2 4/4] ddraw/tests: Also test RT caps for software device for ddraw7.
by Paul Gofman Feb. 16, 2021
by Paul Gofman Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
v2:
- fix test failures on Testbot.
dlls/ddraw/tests/ddraw7.c | 313 ++++++++++++++++++++++----------------
1 file changed, 181 insertions(+), 132 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 628360630dc..89bdb9dffd4 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -6087,14 +6087,14 @@ static void test_unsupported_formats(void)
static void test_rt_caps(void)
{
- const GUID *devtype = &IID_IDirect3DHALDevice;
PALETTEENTRY palette_entries[256];
IDirectDrawPalette *palette;
+ unsigned int i, device_type;
+ DWORD expected_caps;
IDirectDraw7 *ddraw;
BOOL hal_ok = FALSE;
DDPIXELFORMAT z_fmt;
IDirect3D7 *d3d;
- unsigned int i;
ULONG refcount;
HWND window;
HRESULT hr;
@@ -6105,11 +6105,17 @@ static void test_rt_caps(void)
{8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000},
};
+ static const GUID *test_devices[] =
+ {
+ &IID_IDirect3DHALDevice,
+ &IID_IDirect3DRGBDevice,
+ };
+
const struct
{
const DDPIXELFORMAT *pf;
DWORD caps_in;
- DWORD caps_out;
+ DWORD caps_out[ARRAY_SIZE(test_devices)];
DWORD caps2_in;
DWORD caps2_out;
HRESULT create_device_hr;
@@ -6120,27 +6126,29 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,},
0,
0,
- D3D_OK,
- D3D_OK,
- D3D_OK,
+ DD_OK,
+ DD_OK,
+ DD_OK,
},
{
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY},
0,
0,
- D3D_OK,
- D3D_OK,
- D3D_OK,
+ DD_OK,
+ DD_OK,
+ DD_OK,
},
{
NULL,
DDSCAPS_OFFSCREENPLAIN,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6150,17 +6158,17 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE},
0,
0,
D3DERR_SURFACENOTINVIDMEM,
DDERR_INVALIDPARAMS,
- D3D_OK,
+ DD_OK,
},
{
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6170,27 +6178,28 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY,
- DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM},
0,
0,
- D3D_OK,
- D3D_OK,
- D3D_OK,
+ DD_OK,
+ DD_OK,
+ DD_OK,
},
{
NULL,
DDSCAPS_3DDEVICE,
- DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY},
0,
0,
- D3D_OK,
- D3D_OK,
- D3D_OK,
+ DD_OK,
+ DD_OK,
+ DD_OK,
},
{
NULL,
0,
- DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM, DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6200,7 +6209,7 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
- DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE},
0,
0,
D3DERR_SURFACENOTINVIDMEM,
@@ -6210,7 +6219,7 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_SYSTEMMEMORY,
- DDSCAPS_SYSTEMMEMORY,
+ {DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6220,7 +6229,7 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE,
- DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY,
+ {DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY},
DDSCAPS2_TEXTUREMANAGE,
DDSCAPS2_TEXTUREMANAGE,
D3DERR_SURFACENOTINVIDMEM,
@@ -6230,7 +6239,7 @@ static void test_rt_caps(void)
{
NULL,
DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE,
- DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY,
+ {DDSCAPS_TEXTURE | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY},
DDSCAPS2_D3DTEXTUREMANAGE,
DDSCAPS2_D3DTEXTUREMANAGE,
D3DERR_SURFACENOTINVIDMEM,
@@ -6240,7 +6249,7 @@ static void test_rt_caps(void)
{
&p8_fmt,
0,
- DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM},
0,
0,
DDERR_INVALIDCAPS,
@@ -6250,7 +6259,7 @@ static void test_rt_caps(void)
{
&p8_fmt,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE,
- ~0U /* AMD r200 */,
+ {~0u /* AMD r200 */, DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_NOPALETTEATTACHED,
@@ -6260,7 +6269,8 @@ static void test_rt_caps(void)
{
&p8_fmt,
DDSCAPS_OFFSCREENPLAIN,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6270,7 +6280,7 @@ static void test_rt_caps(void)
{
&p8_fmt,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE},
0,
0,
DDERR_NOPALETTEATTACHED,
@@ -6280,7 +6290,7 @@ static void test_rt_caps(void)
{
&p8_fmt,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY,
- DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY,
+ {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY},
0,
0,
DDERR_INVALIDCAPS,
@@ -6290,7 +6300,7 @@ static void test_rt_caps(void)
{
&z_fmt,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER,
- DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM},
0,
0,
DDERR_INVALIDCAPS,
@@ -6300,7 +6310,8 @@ static void test_rt_caps(void)
{
&z_fmt,
DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER,
- DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_3DDEVICE | DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER},
0,
0,
DDERR_INVALIDCAPS,
@@ -6310,7 +6321,8 @@ static void test_rt_caps(void)
{
&z_fmt,
DDSCAPS_ZBUFFER,
- DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM,
+ {DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER | DDSCAPS_LOCALVIDMEM,
+ DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER},
0,
0,
DDERR_INVALIDCAPS,
@@ -6320,7 +6332,7 @@ static void test_rt_caps(void)
{
&z_fmt,
DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER,
- DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER,
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_3DDEVICE | DDSCAPS_ZBUFFER},
0,
0,
DDERR_INVALIDCAPS,
@@ -6330,7 +6342,7 @@ static void test_rt_caps(void)
{
&z_fmt,
DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER,
- DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER,
+ {DDSCAPS_SYSTEMMEMORY | DDSCAPS_ZBUFFER},
0,
0,
DDERR_INVALIDCAPS,
@@ -6352,124 +6364,161 @@ static void test_rt_caps(void)
}
hr = IDirect3D7_EnumDevices(d3d, enum_devtype_cb, &hal_ok);
- ok(SUCCEEDED(hr), "Failed to enumerate devices, hr %#x.\n", hr);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
if (hal_ok)
- devtype = &IID_IDirect3DTnLHalDevice;
-
- memset(&z_fmt, 0, sizeof(z_fmt));
- hr = IDirect3D7_EnumZBufferFormats(d3d, devtype, enum_z_fmt, &z_fmt);
- if (FAILED(hr) || !z_fmt.dwSize)
- {
- skip("No depth buffer formats available, skipping test.\n");
- IDirect3D7_Release(d3d);
- goto done;
- }
+ test_devices[0] = &IID_IDirect3DTnLHalDevice;
memset(palette_entries, 0, sizeof(palette_entries));
hr = IDirectDraw7_CreatePalette(ddraw, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, palette_entries, &palette, NULL);
- ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
- for (i = 0; i < ARRAY_SIZE(test_data); ++i)
+ for (device_type = 0; device_type < ARRAY_SIZE(test_devices); ++device_type)
{
- IDirectDrawSurface7 *surface, *rt, *expected_rt, *tmp;
- DDSURFACEDESC2 surface_desc;
- IDirect3DDevice7 *device;
-
- memset(&surface_desc, 0, sizeof(surface_desc));
- surface_desc.dwSize = sizeof(surface_desc);
- surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
- surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in;
- if (test_data[i].pf)
+ memset(&z_fmt, 0, sizeof(z_fmt));
+ hr = IDirect3D7_EnumZBufferFormats(d3d, test_devices[device_type], enum_z_fmt, &z_fmt);
+ if (FAILED(hr) || !z_fmt.dwSize)
{
- surface_desc.dwFlags |= DDSD_PIXELFORMAT;
- U4(surface_desc).ddpfPixelFormat = *test_data[i].pf;
+ skip("No depth buffer formats available, device_type %u, skipping test.\n", device_type);
+ continue;
}
- surface_desc.dwWidth = 640;
- surface_desc.dwHeight = 480;
- hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
- ok(SUCCEEDED(hr), "Test %u: Failed to create surface with caps %#x and caps2 %#x, hr %#x.\n",
- i, test_data[i].caps_in, test_data[i].caps2_in, hr);
-
- memset(&surface_desc, 0, sizeof(surface_desc));
- surface_desc.dwSize = sizeof(surface_desc);
- hr = IDirectDrawSurface7_GetSurfaceDesc(surface, &surface_desc);
- ok(SUCCEEDED(hr), "Test %u: Failed to get surface desc, hr %#x.\n", i, hr);
- ok(test_data[i].caps_out == ~0U || surface_desc.ddsCaps.dwCaps == test_data[i].caps_out,
- "Test %u: Got unexpected caps %#x, expected %#x.\n",
- i, surface_desc.ddsCaps.dwCaps, test_data[i].caps_out);
- ok(surface_desc.ddsCaps.dwCaps2 == test_data[i].caps2_out,
- "Test %u: Got unexpected caps2 %#x, expected %#x.\n",
- i, surface_desc.ddsCaps.dwCaps2, test_data[i].caps2_out);
- hr = IDirect3D7_CreateDevice(d3d, devtype, surface, &device);
- ok(hr == test_data[i].create_device_hr, "Test %u: Got unexpected hr %#x, expected %#x.\n",
- i, hr, test_data[i].create_device_hr);
- if (FAILED(hr))
+ for (i = 0; i < ARRAY_SIZE(test_data); ++i)
{
- if (hr == DDERR_NOPALETTEATTACHED)
- {
- hr = IDirectDrawSurface7_SetPalette(surface, palette);
- ok(SUCCEEDED(hr), "Test %u: Failed to set palette, hr %#x.\n", i, hr);
- hr = IDirect3D7_CreateDevice(d3d, devtype, surface, &device);
- if (surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
- ok(hr == DDERR_INVALIDPIXELFORMAT, "Test %u: Got unexpected hr %#x.\n", i, hr);
- else
- ok(hr == D3DERR_SURFACENOTINVIDMEM, "Test %u: Got unexpected hr %#x.\n", i, hr);
- }
- IDirectDrawSurface7_Release(surface);
+ IDirectDrawSurface7 *surface, *rt, *expected_rt, *tmp;
+ DDSURFACEDESC2 surface_desc;
+ IDirect3DDevice7 *device;
memset(&surface_desc, 0, sizeof(surface_desc));
surface_desc.dwSize = sizeof(surface_desc);
surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+ surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
+ surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in;
+ if (test_data[i].pf)
+ {
+ surface_desc.dwFlags |= DDSD_PIXELFORMAT;
+ U4(surface_desc).ddpfPixelFormat = *test_data[i].pf;
+ }
surface_desc.dwWidth = 640;
surface_desc.dwHeight = 480;
hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
- ok(SUCCEEDED(hr), "Test %u: Failed to create surface, hr %#x.\n", i, hr);
+ if (surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY && hr == DDERR_NODIRECTDRAWHW)
+ {
+ skip("No 3d hardwate, skipping test %u, device_type %u.\n", i, device_type);
+ continue;
+ }
+ ok(hr == DD_OK || (device_type && (surface_desc.ddsCaps.dwCaps & (DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER))
+ == (DDSCAPS_VIDEOMEMORY | DDSCAPS_ZBUFFER) && hr == DDERR_UNSUPPORTED)
+ || broken(device_type && test_data[i].pf == &p8_fmt && hr == DDERR_INVALIDPIXELFORMAT),
+ "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ if (FAILED(hr))
+ continue;
- hr = IDirect3D7_CreateDevice(d3d, devtype, surface, &device);
- ok(SUCCEEDED(hr), "Test %u: Failed to create device, hr %#x.\n", i, hr);
- }
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ hr = IDirectDrawSurface7_GetSurfaceDesc(surface, &surface_desc);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
- memset(&surface_desc, 0, sizeof(surface_desc));
- surface_desc.dwSize = sizeof(surface_desc);
- surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
- surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in;
- if (test_data[i].pf)
- {
- surface_desc.dwFlags |= DDSD_PIXELFORMAT;
- U4(surface_desc).ddpfPixelFormat = *test_data[i].pf;
- }
- surface_desc.dwWidth = 640;
- surface_desc.dwHeight = 480;
- hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &rt, NULL);
- ok(SUCCEEDED(hr), "Test %u: Failed to create surface with caps %#x, hr %#x.\n",
- i, test_data[i].caps_in, hr);
+ if (device_type)
+ {
+ expected_caps = test_data[i].caps_out[device_type]
+ ? test_data[i].caps_out[device_type] : test_data[i].caps_out[0];
+
+ todo_wine_if(test_data[i].caps_out[device_type]
+ && surface_desc.ddsCaps.dwCaps == test_data[i].caps_out[0])
+ ok(surface_desc.ddsCaps.dwCaps == expected_caps
+ || broken(surface_desc.ddsCaps.dwCaps == test_data[i].caps_out[0]),
+ "Got unexpected caps %#x, test %u, device_type %u.\n",
+ surface_desc.ddsCaps.dwCaps, i, device_type);
+ }
+ else
+ {
+ ok(test_data[i].caps_out[0] == ~0u || surface_desc.ddsCaps.dwCaps == test_data[i].caps_out[0],
+ "Got unexpected caps %#x, expected %#x, test %u, device_type %u.\n",
+ surface_desc.ddsCaps.dwCaps, test_data[i].caps_out[0], i, device_type);
+ }
+ ok(surface_desc.ddsCaps.dwCaps2 == test_data[i].caps2_out,
+ "Got unexpected caps2 %#x, expected %#x, test %u, device_type %u.\n",
+ surface_desc.ddsCaps.dwCaps2, test_data[i].caps2_out, i, device_type);
+
+ hr = IDirect3D7_CreateDevice(d3d, test_devices[device_type], surface, &device);
+ todo_wine_if(device_type && test_data[i].create_device_hr == D3DERR_SURFACENOTINVIDMEM)
+ ok((!device_type && hr == test_data[i].create_device_hr)
+ || (device_type && (hr == (test_data[i].create_device_hr == D3DERR_SURFACENOTINVIDMEM
+ ? DD_OK : test_data[i].create_device_hr))),
+ "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ if (FAILED(hr))
+ {
+ if (hr == DDERR_NOPALETTEATTACHED)
+ {
+ hr = IDirectDrawSurface7_SetPalette(surface, palette);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ hr = IDirect3D7_CreateDevice(d3d, test_devices[device_type], surface, &device);
+ if (surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
+ ok(hr == DDERR_INVALIDPIXELFORMAT, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ else if (device_type)
+ todo_wine
+ ok(hr == E_FAIL, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ else
+ ok(hr == D3DERR_SURFACENOTINVIDMEM, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ }
+ IDirectDrawSurface7_Release(surface);
- hr = IDirect3DDevice7_SetRenderTarget(device, rt, 0);
- ok(hr == test_data[i].set_rt_hr || broken(hr == test_data[i].alternative_set_rt_hr),
- "Test %u: Got unexpected hr %#x, expected %#x.\n",
- i, hr, test_data[i].set_rt_hr);
- if (SUCCEEDED(hr) || hr == DDERR_INVALIDPIXELFORMAT)
- expected_rt = rt;
- else
- expected_rt = surface;
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ surface_desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+
+ hr = IDirect3D7_CreateDevice(d3d, test_devices[device_type], surface, &device);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ }
- hr = IDirect3DDevice7_GetRenderTarget(device, &tmp);
- ok(SUCCEEDED(hr), "Test %u: Failed to get render target, hr %#x.\n", i, hr);
- ok(tmp == expected_rt, "Test %u: Got unexpected rt %p.\n", i, tmp);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
+ surface_desc.ddsCaps.dwCaps2 = test_data[i].caps2_in;
+ if (test_data[i].pf)
+ {
+ surface_desc.dwFlags |= DDSD_PIXELFORMAT;
+ U4(surface_desc).ddpfPixelFormat = *test_data[i].pf;
+ }
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &rt, NULL);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
- IDirectDrawSurface7_Release(tmp);
- IDirectDrawSurface7_Release(rt);
- refcount = IDirect3DDevice7_Release(device);
- ok(refcount == 0, "Test %u: The device was not properly freed, refcount %u.\n", i, refcount);
- refcount = IDirectDrawSurface7_Release(surface);
- ok(refcount == 0, "Test %u: The surface was not properly freed, refcount %u.\n", i, refcount);
+ hr = IDirect3DDevice7_SetRenderTarget(device, rt, 0);
+ ok(hr == test_data[i].set_rt_hr || (device_type && hr == DDERR_NOPALETTEATTACHED)
+ || broken(hr == test_data[i].alternative_set_rt_hr),
+ "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ if (SUCCEEDED(hr) || hr == DDERR_INVALIDPIXELFORMAT)
+ expected_rt = rt;
+ else
+ expected_rt = surface;
+
+ hr = IDirect3DDevice7_GetRenderTarget(device, &tmp);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ ok(tmp == expected_rt, "Got unexpected rt %p, test %u, device_type %u.\n", tmp, i, device_type);
+
+ IDirectDrawSurface7_Release(tmp);
+ IDirectDrawSurface7_Release(rt);
+ refcount = IDirect3DDevice7_Release(device);
+ ok(refcount == 0, "Test %u: The device was not properly freed, refcount %u.\n", i, refcount);
+ refcount = IDirectDrawSurface7_Release(surface);
+ ok(refcount == 0, "Test %u: The surface was not properly freed, refcount %u.\n", i, refcount);
+ }
}
- IDirectDrawPalette_Release(palette);
+ refcount = IDirectDrawPalette_Release(palette);
+ ok(!refcount, "Got unexpected refcount %u.\n", refcount);
IDirect3D7_Release(d3d);
done:
--
2.29.2
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 5 ++++-
dlls/dwrite/opentype.c | 2 +-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index fa82a8d4376..830c71f0abf 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -564,7 +564,10 @@ struct shaping_feature
#define MAX_SHAPING_STAGE 16
-typedef void (*stage_func)(struct scriptshaping_context *context);
+struct shaping_features;
+
+typedef void (*stage_func)(struct scriptshaping_context *context,
+ const struct shaping_features *features);
struct shaping_stage
{
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c
index afae1b69d07..125b7353031 100644
--- a/dlls/dwrite/opentype.c
+++ b/dlls/dwrite/opentype.c
@@ -6070,7 +6070,7 @@ void opentype_layout_apply_gsub_features(struct scriptshaping_context *context,
}
if (features->stages[j].func)
- features->stages[j].func(context);
+ features->stages[j].func(context, features);
}
/* For every glyph range of [<last>.isClusterStart, <next>.isClusterStart) set corresponding
--
2.30.0
2
4
Feb. 16, 2021
v2: Fixed test.
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msado15/recordset.c | 43 ++++++++++++++++++++++++++++++++++++
dlls/msado15/tests/msado15.c | 2 +-
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c
index e830f66e1ba..12bb9680258 100644
--- a/dlls/msado15/recordset.c
+++ b/dlls/msado15/recordset.c
@@ -721,6 +721,46 @@ static const ISupportErrorInfoVtbl fields_supporterrorinfo_vtbl =
fields_supporterrorinfo_InterfaceSupportsErrorInfo
};
+static void map_rowset_fields(struct recordset *recordset, struct fields *fields)
+{
+ HRESULT hr;
+ IColumnsInfo *columninfo;
+ DBORDINAL columns, i;
+ DBCOLUMNINFO *colinfo;
+ OLECHAR *stringsbuffer;
+
+ /* Not Finding the interface or GetColumnInfo failing just causes 0 Fields to be returned */
+ hr = IRowset_QueryInterface(recordset->row_set, &IID_IColumnsInfo, (void**)&columninfo);
+ if (FAILED(hr))
+ return;
+
+ hr = IColumnsInfo_GetColumnInfo(columninfo, &columns, &colinfo, &stringsbuffer);
+ if (SUCCEEDED(hr))
+ {
+ for (i=0; i < columns; i++)
+ {
+ TRACE("Adding Column %lu, pwszName: %s, pTypeInfo %p, iOrdinal %lu, dwFlags 0x%08x, "
+ "ulColumnSize %lu, wType %d, bPrecision %d, bScale %d\n",
+ i, debugstr_w(colinfo[i].pwszName), colinfo[i].pTypeInfo, colinfo[i].iOrdinal,
+ colinfo[i].dwFlags, colinfo[i].ulColumnSize, colinfo[i].wType,
+ colinfo[i].bPrecision, colinfo[i].bScale);
+
+ hr = append_field(fields, colinfo[i].pwszName, colinfo[i].wType, colinfo[i].ulColumnSize,
+ colinfo[i].dwFlags, NULL);
+ if (FAILED(hr))
+ {
+ ERR("Failed to add Field name - 0x%08x\n", hr);
+ return;
+ }
+ }
+
+ CoTaskMemFree(colinfo);
+ CoTaskMemFree(stringsbuffer);
+ }
+
+ IColumnsInfo_Release(columninfo);
+}
+
static HRESULT fields_create( struct recordset *recordset, struct fields **ret )
{
struct fields *fields;
@@ -732,6 +772,9 @@ static HRESULT fields_create( struct recordset *recordset, struct fields **ret )
fields->recordset = recordset;
_Recordset_AddRef( &fields->recordset->Recordset_iface );
+ if ( recordset->row_set )
+ map_rowset_fields(recordset, fields);
+
*ret = fields;
TRACE( "returning %p\n", *ret );
return S_OK;
diff --git a/dlls/msado15/tests/msado15.c b/dlls/msado15/tests/msado15.c
index 50418690613..bc9b4a24761 100644
--- a/dlls/msado15/tests/msado15.c
+++ b/dlls/msado15/tests/msado15.c
@@ -596,7 +596,7 @@ static void test_ADORecordsetConstruction(void)
count = -1;
hr = Fields_get_Count( fields, &count );
- todo_wine ok( count == 1, "got %d\n", count );
+ ok( count == 1, "got %d\n", count );
if (count > 0)
{
VARIANT index;
--
2.30.0
2
1
[PATCH 1/4] ddraw/tests: Also test RT caps for software device for ddraw1.
by Paul Gofman Feb. 16, 2021
by Paul Gofman Feb. 16, 2021
Feb. 16, 2021
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
dlls/ddraw/tests/ddraw1.c | 136 +++++++++++++++++++++-----------------
1 file changed, 77 insertions(+), 59 deletions(-)
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
index d3e9fe0e1ff..77513d92a94 100644
--- a/dlls/ddraw/tests/ddraw1.c
+++ b/dlls/ddraw/tests/ddraw1.c
@@ -4320,10 +4320,10 @@ static void test_rt_caps(void)
{
PALETTEENTRY palette_entries[256];
IDirectDrawPalette *palette;
+ unsigned int i, device_type;
IDirect3DDevice *device;
IDirectDraw *ddraw;
DWORD z_depth = 0;
- unsigned int i;
ULONG refcount;
HWND window;
HRESULT hr;
@@ -4334,6 +4334,12 @@ static void test_rt_caps(void)
{8}, {0x00000000}, {0x00000000}, {0x00000000}, {0x00000000},
};
+ static const REFCLSID test_devices[] =
+ {
+ &IID_IDirect3DHALDevice,
+ &IID_IDirect3DRGBDevice,
+ };
+
static const struct
{
const DDPIXELFORMAT *pf;
@@ -4348,14 +4354,14 @@ static void test_rt_caps(void)
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
- D3D_OK,
+ DD_OK,
FALSE,
},
{
NULL,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE,
DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
- D3D_OK,
+ DD_OK,
FALSE,
},
{
@@ -4383,14 +4389,14 @@ static void test_rt_caps(void)
NULL,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
- D3D_OK,
+ DD_OK,
FALSE,
},
{
NULL,
DDSCAPS_3DDEVICE,
DDSCAPS_3DDEVICE | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM,
- D3D_OK,
+ DD_OK,
FALSE,
},
{
@@ -4502,66 +4508,78 @@ static void test_rt_caps(void)
memset(palette_entries, 0, sizeof(palette_entries));
hr = IDirectDraw_CreatePalette(ddraw, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, palette_entries, &palette, NULL);
- ok(SUCCEEDED(hr), "Failed to create palette, hr %#x.\n", hr);
+ ok(hr == DD_OK, "Got unexpected hr %#x.\n", hr);
- for (i = 0; i < ARRAY_SIZE(test_data); ++i)
+ for (device_type = 0; device_type < ARRAY_SIZE(test_devices); ++device_type)
{
- IDirectDrawSurface *surface;
- DDSURFACEDESC surface_desc;
- IDirect3DDevice *device;
-
- memset(&surface_desc, 0, sizeof(surface_desc));
- surface_desc.dwSize = sizeof(surface_desc);
- surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
- surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
- if (test_data[i].pf)
- {
- surface_desc.dwFlags |= DDSD_PIXELFORMAT;
- surface_desc.ddpfPixelFormat = *test_data[i].pf;
- }
- if (test_data[i].caps_in & DDSCAPS_ZBUFFER)
+ for (i = 0; i < ARRAY_SIZE(test_data); ++i)
{
- surface_desc.dwFlags |= DDSD_ZBUFFERBITDEPTH;
- U2(surface_desc).dwZBufferBitDepth = z_depth;
- }
- surface_desc.dwWidth = 640;
- surface_desc.dwHeight = 480;
- hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
- ok(SUCCEEDED(hr) || broken(test_data[i].create_may_fail),
- "Test %u: Failed to create surface with caps %#x, hr %#x.\n",
- i, test_data[i].caps_in, hr);
- if (FAILED(hr))
- continue;
+ IDirectDrawSurface *surface;
+ DDSURFACEDESC surface_desc;
+ IDirect3DDevice *device;
- memset(&surface_desc, 0, sizeof(surface_desc));
- surface_desc.dwSize = sizeof(surface_desc);
- hr = IDirectDrawSurface_GetSurfaceDesc(surface, &surface_desc);
- ok(SUCCEEDED(hr), "Test %u: Failed to get surface desc, hr %#x.\n", i, hr);
- ok(test_data[i].caps_out == ~0U || surface_desc.ddsCaps.dwCaps == test_data[i].caps_out,
- "Test %u: Got unexpected caps %#x, expected %#x.\n",
- i, surface_desc.ddsCaps.dwCaps, test_data[i].caps_out);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
+ surface_desc.ddsCaps.dwCaps = test_data[i].caps_in;
+ if (test_data[i].pf)
+ {
+ surface_desc.dwFlags |= DDSD_PIXELFORMAT;
+ surface_desc.ddpfPixelFormat = *test_data[i].pf;
+ }
+ if (test_data[i].caps_in & DDSCAPS_ZBUFFER)
+ {
+ surface_desc.dwFlags |= DDSD_ZBUFFERBITDEPTH;
+ U2(surface_desc).dwZBufferBitDepth = z_depth;
+ }
+ surface_desc.dwWidth = 640;
+ surface_desc.dwHeight = 480;
+ hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
+ ok(hr == DD_OK || broken(test_data[i].create_may_fail),
+ "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
- hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DHALDevice, (void **)&device);
- ok(hr == test_data[i].create_device_hr, "Test %u: Got unexpected hr %#x, expected %#x.\n",
- i, hr, test_data[i].create_device_hr);
- if (hr == DDERR_NOPALETTEATTACHED)
- {
- hr = IDirectDrawSurface_SetPalette(surface, palette);
- ok(SUCCEEDED(hr), "Test %u: Failed to set palette, hr %#x.\n", i, hr);
- hr = IDirectDrawSurface_QueryInterface(surface, &IID_IDirect3DHALDevice, (void **)&device);
- if (surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
- ok(hr == DDERR_INVALIDPIXELFORMAT, "Test %u: Got unexpected hr %#x.\n", i, hr);
- else
- ok(hr == D3DERR_SURFACENOTINVIDMEM, "Test %u: Got unexpected hr %#x.\n", i, hr);
- }
- if (SUCCEEDED(hr))
- {
- refcount = IDirect3DDevice_Release(device);
- ok(refcount == 1, "Test %u: Got unexpected refcount %u.\n", i, refcount);
- }
+ if (FAILED(hr))
+ continue;
- refcount = IDirectDrawSurface_Release(surface);
- ok(refcount == 0, "Test %u: The surface was not properly freed, refcount %u.\n", i, refcount);
+ memset(&surface_desc, 0, sizeof(surface_desc));
+ surface_desc.dwSize = sizeof(surface_desc);
+ hr = IDirectDrawSurface_GetSurfaceDesc(surface, &surface_desc);
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ ok(test_data[i].caps_out == ~0u || surface_desc.ddsCaps.dwCaps == test_data[i].caps_out,
+ "Got unexpected caps %#x, expected %#x, test %u, device_type %u.\n",
+ surface_desc.ddsCaps.dwCaps, test_data[i].caps_out, i, device_type);
+
+ hr = IDirectDrawSurface_QueryInterface(surface, test_devices[device_type], (void **)&device);
+ todo_wine_if(device_type && test_data[i].create_device_hr == D3DERR_SURFACENOTINVIDMEM)
+ ok((!device_type && hr == test_data[i].create_device_hr)
+ || (device_type && (hr == (test_data[i].create_device_hr == D3DERR_SURFACENOTINVIDMEM
+ ? DD_OK : test_data[i].create_device_hr))),
+ "Got unexpected hr %#x, test %u, device_type %u.\n", hr, i, device_type);
+ if (hr == DDERR_NOPALETTEATTACHED)
+ {
+ hr = IDirectDrawSurface_SetPalette(surface, palette);
+ ok(SUCCEEDED(hr), "Test %u: Failed to set palette, hr %#x.\n", i, hr);
+ hr = IDirectDrawSurface_QueryInterface(surface, test_devices[device_type], (void **)&device);
+ if (device_type == 1)
+ todo_wine
+ ok(hr == DD_OK, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ else if (surface_desc.ddsCaps.dwCaps & DDSCAPS_VIDEOMEMORY)
+ ok(hr == DDERR_INVALIDPIXELFORMAT, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ else
+ ok(hr == D3DERR_SURFACENOTINVIDMEM, "Got unexpected hr %#x, test %u, device_type %u.\n",
+ hr, i, device_type);
+ }
+ if (SUCCEEDED(hr))
+ {
+ refcount = IDirect3DDevice_Release(device);
+ ok(refcount == 1, "Test %u: Got unexpected refcount %u.\n", i, refcount);
+ }
+
+ refcount = IDirectDrawSurface_Release(surface);
+ ok(refcount == 0, "Test %u: The surface was not properly freed, refcount %u.\n", i, refcount);
+ }
}
IDirectDrawPalette_Release(palette);
--
2.29.2
2
7