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 3/6] msdasql: Support IColumnsInfo in Rowset
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 56 ++++++++++++++++++++++++++++++++++-
dlls/msdasql/tests/provider.c | 5 ++++
2 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index 85b11670687..898cf6fa864 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -413,6 +413,7 @@ struct msdasql_rowset
{
IRowset IRowset_iface;
IRowsetInfo IRowsetInfo_iface;
+ IColumnsInfo IColumnsInfo_iface;
LONG refs;
};
@@ -426,6 +427,11 @@ static inline struct msdasql_rowset *impl_from_IRowsetInfo( IRowsetInfo *iface )
return CONTAINING_RECORD( iface, struct msdasql_rowset, IRowsetInfo_iface );
}
+static inline struct msdasql_rowset *rowset_impl_from_IColumnsInfo( IColumnsInfo *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_rowset, IColumnsInfo_iface );
+}
+
static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid, void **ppv)
{
struct msdasql_rowset *rowset = impl_from_IRowset( iface );
@@ -442,6 +448,10 @@ static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid,
{
*ppv = &rowset->IRowsetInfo_iface;
}
+ else if (IsEqualGUID(&IID_IColumnsInfo, riid))
+ {
+ *ppv = &rowset->IColumnsInfo_iface;
+ }
if(*ppv)
{
@@ -547,7 +557,7 @@ static HRESULT WINAPI rowset_info_GetProperties(IRowsetInfo *iface, const ULONG
const DBPROPIDSET propertyidsets[], ULONG *out_count, DBPROPSET **propertysets)
{
struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
- FIXME("%p, %ld, %p, %p, %p\n", rowset, count, propertyidsets, out_count, propertysets);
+ FIXME("%p, %d, %p, %p, %p\n", rowset, count, propertyidsets, out_count, propertysets);
return E_NOTIMPL;
}
@@ -577,6 +587,49 @@ struct IRowsetInfoVtbl rowset_info_vtbl =
rowset_info_GetSpecification
};
+static HRESULT WINAPI rowset_colsinfo_QueryInterface(IColumnsInfo *iface, REFIID riid, void **out)
+{
+ struct msdasql_rowset *rowset = rowset_impl_from_IColumnsInfo( iface );
+ return IRowset_QueryInterface(&rowset->IRowset_iface, riid, out);
+}
+
+static ULONG WINAPI rowset_colsinfo_AddRef(IColumnsInfo *iface)
+{
+ struct msdasql_rowset *rowset = rowset_impl_from_IColumnsInfo( iface );
+ return IRowset_AddRef(&rowset->IRowset_iface);
+}
+
+static ULONG WINAPI rowset_colsinfo_Release(IColumnsInfo *iface)
+{
+ struct msdasql_rowset *rowset = rowset_impl_from_IColumnsInfo( iface );
+ return IRowset_Release(&rowset->IRowset_iface);
+}
+
+static HRESULT WINAPI rowset_colsinfo_GetColumnInfo(IColumnsInfo *iface, DBORDINAL *columns,
+ DBCOLUMNINFO **colinfo, OLECHAR **stringsbuffer)
+{
+ struct msdasql_rowset *rowset = rowset_impl_from_IColumnsInfo( iface );
+ FIXME("%p, %p, %p, %p\n", rowset, columns, colinfo, stringsbuffer);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_colsinfo_MapColumnIDs(IColumnsInfo *iface, DBORDINAL column_ids,
+ const DBID *dbids, DBORDINAL *columns)
+{
+ struct msdasql_rowset *rowset = rowset_impl_from_IColumnsInfo( iface );
+ FIXME("%p, %lu, %p, %p\n", rowset, column_ids, dbids, columns);
+ return E_NOTIMPL;
+}
+
+static struct IColumnsInfoVtbl rowset_columninfo_vtbll =
+{
+ rowset_colsinfo_QueryInterface,
+ rowset_colsinfo_AddRef,
+ rowset_colsinfo_Release,
+ rowset_colsinfo_GetColumnInfo,
+ rowset_colsinfo_MapColumnIDs
+};
+
static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFIID riid,
DBPARAMS *params, DBROWCOUNT *affected, IUnknown **rowset)
{
@@ -592,6 +645,7 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI
msrowset->IRowset_iface.lpVtbl = &msdasql_rowset_vtbl;
msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
+ msrowset->IColumnsInfo_iface.lpVtbl = &rowset_columninfo_vtbll;
msrowset->refs = 1;
if (affected)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index 604815b1ee5..708d6d22ed3 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -225,11 +225,16 @@ static void test_command_dbsession(IUnknown *cmd, IUnknown *session)
static void test_rowset_interfaces(IRowset *rowset)
{
IRowsetInfo *info;
+ IColumnsInfo *col_info;
HRESULT hr;
hr = IRowset_QueryInterface(rowset, &IID_IRowsetInfo, (void**)&info);
ok(hr == S_OK, "got 0x%08x\n", hr);
IRowsetInfo_Release(info);
+
+ hr = IRowset_QueryInterface(rowset, &IID_IColumnsInfo, (void**)&col_info);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IColumnsInfo_Release(col_info);
}
static void test_command_rowset(IUnknown *cmd)
--
2.33.0
Nov. 2, 2021
[PATCH 2/6] msdasql: Support IRowsetInfo in IRowset interface
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/session.c | 63 +++++++++++++++++++++++++++++++++++
dlls/msdasql/tests/provider.c | 12 +++++++
2 files changed, 75 insertions(+)
diff --git a/dlls/msdasql/session.c b/dlls/msdasql/session.c
index 6a1e6bb8e0d..85b11670687 100644
--- a/dlls/msdasql/session.c
+++ b/dlls/msdasql/session.c
@@ -412,6 +412,7 @@ static HRESULT WINAPI command_Cancel(ICommandText *iface)
struct msdasql_rowset
{
IRowset IRowset_iface;
+ IRowsetInfo IRowsetInfo_iface;
LONG refs;
};
@@ -420,6 +421,11 @@ static inline struct msdasql_rowset *impl_from_IRowset( IRowset *iface )
return CONTAINING_RECORD( iface, struct msdasql_rowset, IRowset_iface );
}
+static inline struct msdasql_rowset *impl_from_IRowsetInfo( IRowsetInfo *iface )
+{
+ return CONTAINING_RECORD( iface, struct msdasql_rowset, IRowsetInfo_iface );
+}
+
static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid, void **ppv)
{
struct msdasql_rowset *rowset = impl_from_IRowset( iface );
@@ -432,6 +438,10 @@ static HRESULT WINAPI msdasql_rowset_QueryInterface(IRowset *iface, REFIID riid,
{
*ppv = &rowset->IRowset_iface;
}
+ else if (IsEqualGUID(&IID_IRowsetInfo, riid))
+ {
+ *ppv = &rowset->IRowsetInfo_iface;
+ }
if(*ppv)
{
@@ -515,6 +525,58 @@ static const struct IRowsetVtbl msdasql_rowset_vtbl =
msdasql_rowset_RestartPosition
};
+static HRESULT WINAPI rowset_info_QueryInterface(IRowsetInfo *iface, REFIID riid, void **ppv)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ return IRowset_QueryInterface(&rowset->IRowset_iface, riid, ppv);
+}
+
+static ULONG WINAPI rowset_info_AddRef(IRowsetInfo *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ return IRowset_AddRef(&rowset->IRowset_iface);
+}
+
+static ULONG WINAPI rowset_info_Release(IRowsetInfo *iface)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ return IRowset_Release(&rowset->IRowset_iface);
+}
+
+static HRESULT WINAPI rowset_info_GetProperties(IRowsetInfo *iface, const ULONG count,
+ const DBPROPIDSET propertyidsets[], ULONG *out_count, DBPROPSET **propertysets)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ FIXME("%p, %ld, %p, %p, %p\n", rowset, count, propertyidsets, out_count, propertysets);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_info_GetReferencedRowset(IRowsetInfo *iface, DBORDINAL ordinal,
+ REFIID riid, IUnknown **unk)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ FIXME("%p, %ld, %s, %p\n", rowset, ordinal, debugstr_guid(riid), unk);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI rowset_info_GetSpecification(IRowsetInfo *iface, REFIID riid,
+ IUnknown **specification)
+{
+ struct msdasql_rowset *rowset = impl_from_IRowsetInfo( iface );
+ FIXME("%p, %s, %p\n", rowset, debugstr_guid(riid), specification);
+ return E_NOTIMPL;
+}
+
+struct IRowsetInfoVtbl rowset_info_vtbl =
+{
+ rowset_info_QueryInterface,
+ rowset_info_AddRef,
+ rowset_info_Release,
+ rowset_info_GetProperties,
+ rowset_info_GetReferencedRowset,
+ rowset_info_GetSpecification
+};
+
static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFIID riid,
DBPARAMS *params, DBROWCOUNT *affected, IUnknown **rowset)
{
@@ -529,6 +591,7 @@ static HRESULT WINAPI command_Execute(ICommandText *iface, IUnknown *outer, REFI
return E_OUTOFMEMORY;
msrowset->IRowset_iface.lpVtbl = &msdasql_rowset_vtbl;
+ msrowset->IRowsetInfo_iface.lpVtbl = &rowset_info_vtbl;
msrowset->refs = 1;
if (affected)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index 8b8d8e4b494..604815b1ee5 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -222,6 +222,16 @@ static void test_command_dbsession(IUnknown *cmd, IUnknown *session)
ICommandText_Release(comand_text);
}
+static void test_rowset_interfaces(IRowset *rowset)
+{
+ IRowsetInfo *info;
+ HRESULT hr;
+
+ hr = IRowset_QueryInterface(rowset, &IID_IRowsetInfo, (void**)&info);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IRowsetInfo_Release(info);
+}
+
static void test_command_rowset(IUnknown *cmd)
{
ICommandText *comand_text;
@@ -258,6 +268,8 @@ static void test_command_rowset(IUnknown *cmd)
hr = IUnknown_QueryInterface(unk, &IID_IRowset, (void**)&rowset);
ok(hr == S_OK, "got 0x%08x\n", hr);
+ test_rowset_interfaces(rowset);
+
IRowset_Release(rowset);
IUnknown_Release(unk);
}
--
2.33.0
Nov. 2, 2021
[PATCH 1/6] msdasql: Correct ICommandText Execute test
by Alistair Leslie-Hughes
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msdasql/tests/provider.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/dlls/msdasql/tests/provider.c b/dlls/msdasql/tests/provider.c
index df642a6a637..8b8d8e4b494 100644
--- a/dlls/msdasql/tests/provider.c
+++ b/dlls/msdasql/tests/provider.c
@@ -244,12 +244,16 @@ static void test_command_rowset(IUnknown *cmd)
if (unk)
IUnknown_Release(unk);
- affected = 9999;
hr = ICommandText_SetCommandText(comand_text, &DBGUID_DEFAULT, L"select * from testing");
ok(hr == S_OK, "got 0x%08x\n", hr);
- if (hr == S_OK && unk)
+
+ affected = 9999;
+ hr = ICommandText_Execute(comand_text, NULL, &IID_IRowset, NULL, &affected, &unk);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(unk != NULL, "Unexepcted value\n");
+ if (hr == S_OK)
{
- ok(affected == 0, "wrong affected value\n");
+ ok(affected == -1, "wrong affected value\n");
hr = IUnknown_QueryInterface(unk, &IID_IRowset, (void**)&rowset);
ok(hr == S_OK, "got 0x%08x\n", hr);
--
2.33.0
Nov. 2, 2021
Re: [PATCH v5 6/7] gdi32: allow passing BITMAPINFO with bmiHeader.biSizeImage == 0 for EMF DC.
by Jin-oh Kang
On Tue, Nov 2, 2021 at 6:34 AM Jacek Caban <jacek(a)codeweavers.com> wrote:
>
> On 11/1/21 6:31 AM, Jinoh Kang wrote:
> > + UINT elm_size = coloruse == DIB_PAL_COLORS ? sizeof(WORD) : sizeof(DWORD);
> > + UINT colours = dst->biClrUsed;
> > +
> > + if (colours > UINT_MAX / elm_size)
> > + return FALSE;
>
>
> Should we use at most 1 << bpp entries here?
Windows is happy with whatever size is requested for the palette, even
if it's > (1<<bpp). In fact, setting a large colour table size results
in OOM. To replicate this behavior, I set the limit to the maximum
possible with the current implementation.
>
>
> Thanks,
>
> Jacek
>
Nov. 2, 2021
[PATCH vkd3d 5/5] vkd3d-shader/hlsl: Parse the Sample() method.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl.c | 30 +++++++++++++++------
libs/vkd3d-shader/hlsl.h | 8 +++---
libs/vkd3d-shader/hlsl.y | 46 +++++++++++++++++++++++++++++++-
libs/vkd3d-shader/hlsl_codegen.c | 8 ++++++
libs/vkd3d-shader/hlsl_sm4.c | 4 +++
5 files changed, 84 insertions(+), 12 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
index a72e0a18f..da4f10a9f 100644
--- a/libs/vkd3d-shader/hlsl.c
+++ b/libs/vkd3d-shader/hlsl.c
@@ -627,8 +627,9 @@ struct hlsl_ir_load *hlsl_new_var_load(struct hlsl_ctx *ctx, struct hlsl_ir_var
}
struct hlsl_ir_resource_load *hlsl_new_resource_load(struct hlsl_ctx *ctx, struct hlsl_type *data_type,
- enum hlsl_resource_load_type type, struct hlsl_ir_var *resource, struct hlsl_ir_node *offset,
- struct hlsl_ir_node *coords, const struct vkd3d_shader_location *loc)
+ enum hlsl_resource_load_type type, struct hlsl_ir_var *resource, struct hlsl_ir_node *resource_offset,
+ struct hlsl_ir_var *sampler, struct hlsl_ir_node *sampler_offset, struct hlsl_ir_node *coords,
+ const struct vkd3d_shader_location *loc)
{
struct hlsl_ir_resource_load *load;
@@ -637,7 +638,9 @@ struct hlsl_ir_resource_load *hlsl_new_resource_load(struct hlsl_ctx *ctx, struc
init_node(&load->node, HLSL_IR_RESOURCE_LOAD, data_type, *loc);
load->load_type = type;
load->resource.var = resource;
- hlsl_src_from_node(&load->resource.offset, offset);
+ hlsl_src_from_node(&load->resource.offset, resource_offset);
+ load->sampler.var = sampler;
+ hlsl_src_from_node(&load->sampler.offset, sampler_offset);
hlsl_src_from_node(&load->coords, coords);
return load;
}
@@ -1059,12 +1062,19 @@ static void dump_ir_var(struct hlsl_ctx *ctx, struct vkd3d_string_buffer *buffer
static void dump_deref(struct vkd3d_string_buffer *buffer, const struct hlsl_deref *deref)
{
- vkd3d_string_buffer_printf(buffer, "%s", deref->var->name);
- if (deref->offset.node)
+ if (deref->var)
+ {
+ vkd3d_string_buffer_printf(buffer, "%s", deref->var->name);
+ if (deref->offset.node)
+ {
+ vkd3d_string_buffer_printf(buffer, "[");
+ dump_src(buffer, &deref->offset);
+ vkd3d_string_buffer_printf(buffer, "]");
+ }
+ }
+ else
{
- vkd3d_string_buffer_printf(buffer, "[");
- dump_src(buffer, &deref->offset);
- vkd3d_string_buffer_printf(buffer, "]");
+ vkd3d_string_buffer_printf(buffer, "(nil)");
}
}
@@ -1239,10 +1249,13 @@ static void dump_ir_resource_load(struct vkd3d_string_buffer *buffer, const stru
static const char *const type_names[] =
{
[HLSL_RESOURCE_LOAD] = "load_resource",
+ [HLSL_RESOURCE_SAMPLE] = "sample",
};
vkd3d_string_buffer_printf(buffer, "%s(resource = ", type_names[load->load_type]);
dump_deref(buffer, &load->resource);
+ vkd3d_string_buffer_printf(buffer, ", sampler = ");
+ dump_deref(buffer, &load->sampler);
vkd3d_string_buffer_printf(buffer, ", coords = ");
dump_src(buffer, &load->coords);
vkd3d_string_buffer_printf(buffer, ")");
@@ -1419,6 +1432,7 @@ static void free_ir_loop(struct hlsl_ir_loop *loop)
static void free_ir_resource_load(struct hlsl_ir_resource_load *load)
{
hlsl_src_remove(&load->coords);
+ hlsl_src_remove(&load->sampler.offset);
hlsl_src_remove(&load->resource.offset);
vkd3d_free(load);
}
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
index a7503d5c8..eae962321 100644
--- a/libs/vkd3d-shader/hlsl.h
+++ b/libs/vkd3d-shader/hlsl.h
@@ -376,13 +376,14 @@ struct hlsl_ir_load
enum hlsl_resource_load_type
{
HLSL_RESOURCE_LOAD,
+ HLSL_RESOURCE_SAMPLE,
};
struct hlsl_ir_resource_load
{
struct hlsl_ir_node node;
enum hlsl_resource_load_type load_type;
- struct hlsl_deref resource;
+ struct hlsl_deref resource, sampler;
struct hlsl_src coords;
};
@@ -703,8 +704,9 @@ struct hlsl_ir_load *hlsl_new_load(struct hlsl_ctx *ctx, struct hlsl_ir_var *var
struct hlsl_type *type, struct vkd3d_shader_location loc);
struct hlsl_ir_loop *hlsl_new_loop(struct hlsl_ctx *ctx, struct vkd3d_shader_location loc);
struct hlsl_ir_resource_load *hlsl_new_resource_load(struct hlsl_ctx *ctx, struct hlsl_type *data_type,
- enum hlsl_resource_load_type type, struct hlsl_ir_var *resource, struct hlsl_ir_node *offset,
- struct hlsl_ir_node *coords, const struct vkd3d_shader_location *loc);
+ enum hlsl_resource_load_type type, struct hlsl_ir_var *resource, struct hlsl_ir_node *resource_offset,
+ struct hlsl_ir_var *sampler, struct hlsl_ir_node *sampler_offset, struct hlsl_ir_node *coords,
+ const struct vkd3d_shader_location *loc);
struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *lhs, struct hlsl_ir_node *rhs);
struct hlsl_ir_store *hlsl_new_store(struct hlsl_ctx *ctx, struct hlsl_ir_var *var, struct hlsl_ir_node *offset,
struct hlsl_ir_node *rhs, unsigned int writemask, struct vkd3d_shader_location loc);
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
index aae0ebcea..58dd0e349 100644
--- a/libs/vkd3d-shader/hlsl.y
+++ b/libs/vkd3d-shader/hlsl.y
@@ -1803,7 +1803,51 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl
return false;
if (!(load = hlsl_new_resource_load(ctx, object_type->e.resource_format, HLSL_RESOURCE_LOAD,
- object_load->src.var, object_load->src.offset.node, coords, loc)))
+ object_load->src.var, object_load->src.offset.node, NULL, NULL, coords, loc)))
+ return false;
+ list_add_tail(instrs, &load->node.entry);
+ return true;
+ }
+ else if (!strcmp(name, "Sample"))
+ {
+ const unsigned int sampler_dim = sampler_dim_count(object_type->sampler_dim);
+ const struct hlsl_type *sampler_type;
+ struct hlsl_ir_resource_load *load;
+ struct hlsl_ir_load *sampler_load;
+ struct hlsl_ir_node *coords;
+
+ if (params->args_count != 2 && params->args_count != 3)
+ {
+ hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_WRONG_PARAMETER_COUNT,
+ "Wrong number of arguments to method 'Sample': expected 2 or 3, but got %u.", params->args_count);
+ return false;
+ }
+ if (params->args_count == 3)
+ FIXME("Ignoring offset parameter.\n");
+
+ sampler_type = params->args[0]->data_type;
+ if (sampler_type->type != HLSL_CLASS_OBJECT || sampler_type->base_type != HLSL_TYPE_SAMPLER
+ || sampler_type->sampler_dim != HLSL_SAMPLER_DIM_GENERIC)
+ {
+ struct vkd3d_string_buffer *string;
+
+ if ((string = hlsl_type_to_string(ctx, sampler_type)))
+ hlsl_error(ctx, *loc, VKD3D_SHADER_ERROR_HLSL_INVALID_TYPE,
+ "Wrong type for argument 0 of Sample(): expected 'sampler', but got '%s'.", string->buffer);
+ hlsl_release_string_buffer(ctx, string);
+ return false;
+ }
+
+ /* Only HLSL_IR_LOAD can return an object. */
+ sampler_load = hlsl_ir_load(params->args[0]);
+
+ if (!(coords = add_implicit_conversion(ctx, instrs, params->args[1],
+ ctx->builtin_types.vector[HLSL_TYPE_FLOAT][sampler_dim - 1], loc)))
+ coords = params->args[1];
+
+ if (!(load = hlsl_new_resource_load(ctx, object_type->e.resource_format,
+ HLSL_RESOURCE_SAMPLE, object_load->src.var, object_load->src.offset.node,
+ sampler_load->src.var, sampler_load->src.offset.node, coords, loc)))
return false;
list_add_tail(instrs, &load->node.entry);
return true;
diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
index df10ca272..24b8205c1 100644
--- a/libs/vkd3d-shader/hlsl_codegen.c
+++ b/libs/vkd3d-shader/hlsl_codegen.c
@@ -651,6 +651,14 @@ static void compute_liveness_recurse(struct hlsl_block *block, unsigned int loop
var->last_read = max(var->last_read, var_last_read);
if (load->resource.offset.node)
load->resource.offset.node->last_read = instr->index;
+
+ if ((var = load->sampler.var))
+ {
+ var->last_read = max(var->last_read, var_last_read);
+ if (load->sampler.offset.node)
+ load->sampler.offset.node->last_read = instr->index;
+ }
+
load->coords.node->last_read = instr->index;
break;
}
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index 5ab7df5f9..cef7d6b0f 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -1449,6 +1449,10 @@ static void write_sm4_resource_load(struct hlsl_ctx *ctx,
case HLSL_RESOURCE_LOAD:
write_sm4_ld(ctx, buffer, resource_type, &load->node, &load->resource, coords);
break;
+
+ case HLSL_RESOURCE_SAMPLE:
+ hlsl_fixme(ctx, load->node.loc, "Resource sample instruction.");
+ break;
}
}
--
2.33.1
Nov. 2, 2021
[PATCH vkd3d 4/5] vkd3d-shader/hlsl: Lex the SamplerState keyword.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl.l | 1 +
1 file changed, 1 insertion(+)
diff --git a/libs/vkd3d-shader/hlsl.l b/libs/vkd3d-shader/hlsl.l
index 762a8a026..caf8fe8f9 100644
--- a/libs/vkd3d-shader/hlsl.l
+++ b/libs/vkd3d-shader/hlsl.l
@@ -109,6 +109,7 @@ sampler3D {return KW_SAMPLER3D; }
samplerCUBE {return KW_SAMPLERCUBE; }
sampler_state {return KW_SAMPLER_STATE; }
SamplerComparisonState {return KW_SAMPLERCOMPARISONSTATE;}
+SamplerState {return KW_SAMPLER; }
shared {return KW_SHARED; }
stateblock {return KW_STATEBLOCK; }
stateblock_state {return KW_STATEBLOCK_STATE; }
--
2.33.1
Nov. 2, 2021
[PATCH vkd3d 3/5] tests: Add a shader test for texture sampling.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
Makefile.am | 2 +
tests/sampler.shader_test | 34 ++++++++
tests/shader_runner_d3d12.c | 166 +++++++++++++++++++++++++++++++++---
3 files changed, 191 insertions(+), 11 deletions(-)
create mode 100644 tests/sampler.shader_test
diff --git a/Makefile.am b/Makefile.am
index eaa4f8168..d6e14cf14 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -90,6 +90,7 @@ vkd3d_shader_tests = \
tests/preproc-invalid.shader_test \
tests/preproc-macro.shader_test \
tests/preproc-misc.shader_test \
+ tests/sampler.shader_test \
tests/saturate.shader_test \
tests/swizzle-0.shader_test \
tests/swizzle-1.shader_test \
@@ -302,6 +303,7 @@ XFAIL_TESTS = \
tests/hlsl-vector-indexing-uniform.shader_test \
tests/math.shader_test \
tests/max.shader_test \
+ tests/sampler.shader_test \
tests/texture-load.shader_test \
tests/texture-load-typed.shader_test \
tests/trigonometry.shader_test \
diff --git a/tests/sampler.shader_test b/tests/sampler.shader_test
new file mode 100644
index 000000000..3970fb510
--- /dev/null
+++ b/tests/sampler.shader_test
@@ -0,0 +1,34 @@
+[sampler 0]
+filter linear linear linear
+address clamp clamp clamp
+
+[texture 0]
+size (2, 2)
+0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
+0.0 0.0 0.0 0.0 1.0 0.0 1.0 0.0
+
+[pixel shader]
+sampler s;
+Texture2D t;
+
+float4 main() : sv_target
+{
+ return t.Sample(s, float2(0.5, 0.5));
+}
+
+[test]
+draw quad
+probe all rgba (0.25, 0, 0.25, 0)
+
+[pixel shader]
+SamplerState s;
+Texture2D t;
+
+float4 main() : sv_target
+{
+ return t.Sample(s, float2(0.5, 0.5));
+}
+
+[test]
+draw quad
+probe all rgba (0.25, 0, 0.25, 0)
diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c
index e47083765..de5a12835 100644
--- a/tests/shader_runner_d3d12.c
+++ b/tests/shader_runner_d3d12.c
@@ -80,6 +80,14 @@ enum texture_data_type
TEXTURE_DATA_UINT,
};
+struct sampler
+{
+ unsigned int slot;
+
+ D3D12_FILTER filter;
+ D3D12_TEXTURE_ADDRESS_MODE u_address, v_address, w_address;
+};
+
struct texture
{
unsigned int slot;
@@ -108,6 +116,9 @@ struct shader_context
struct texture *textures;
size_t texture_count;
+
+ struct sampler *samplers;
+ size_t sampler_count;
};
static ID3D10Blob *compile_shader(const char *source, const char *target)
@@ -139,6 +150,7 @@ enum parse_state
STATE_NONE,
STATE_PREPROC,
STATE_PREPROC_INVALID,
+ STATE_SAMPLER,
STATE_SHADER_INVALID_PIXEL,
STATE_SHADER_PIXEL,
STATE_TEXTURE,
@@ -195,6 +207,69 @@ static void parse_texture_format(struct texture *texture, const char *line)
texture->texel_size = 16;
}
+static D3D12_TEXTURE_ADDRESS_MODE parse_sampler_address_mode(const char *line, const char **rest)
+{
+ if (match_string(line, "border", rest))
+ return D3D12_TEXTURE_ADDRESS_MODE_BORDER;
+ if (match_string(line, "clamp", rest))
+ return D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ if (match_string(line, "mirror once", rest))
+ return D3D12_TEXTURE_ADDRESS_MODE_MIRROR_ONCE;
+ if (match_string(line, "mirror", rest))
+ return D3D12_TEXTURE_ADDRESS_MODE_MIRROR;
+ if (match_string(line, "wrap", rest))
+ return D3D12_TEXTURE_ADDRESS_MODE_WRAP;
+ fprintf(stderr, "Malformed address mode '%s'.\n", line);
+ return D3D12_TEXTURE_ADDRESS_MODE_WRAP;
+}
+
+static void parse_sampler_directive(struct sampler *sampler, const char *line)
+{
+ const char *const orig_line = line;
+
+ if (match_string(line, "address", &line))
+ {
+ sampler->u_address = parse_sampler_address_mode(line, &line);
+ sampler->v_address = parse_sampler_address_mode(line, &line);
+ sampler->w_address = parse_sampler_address_mode(line, &line);
+ }
+ else if (match_string(line, "filter", &line))
+ {
+ static const struct
+ {
+ const char *string;
+ D3D12_FILTER filter;
+ }
+ filters[] =
+ {
+ {"point point point", D3D12_FILTER_MIN_MAG_MIP_POINT},
+ {"point point linear", D3D12_FILTER_MIN_MAG_POINT_MIP_LINEAR},
+ {"point linear point", D3D12_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT},
+ {"point linear linear", D3D12_FILTER_MIN_POINT_MAG_MIP_LINEAR},
+ {"linear point point", D3D12_FILTER_MIN_LINEAR_MAG_MIP_POINT},
+ {"linear point linear", D3D12_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR},
+ {"linear linear point", D3D12_FILTER_MIN_MAG_LINEAR_MIP_POINT},
+ {"linear linear linear", D3D12_FILTER_MIN_MAG_MIP_LINEAR},
+ };
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(filters); ++i)
+ {
+ if (match_string(line, filters[i].string, &line))
+ sampler->filter = filters[i].filter;
+ }
+ }
+ else
+ {
+ goto err;
+ }
+
+ return;
+
+err:
+ fprintf(stderr, "Ignoring malformed line '%s'.\n", orig_line);
+}
+
static void parse_texture_directive(struct texture *texture, const char *line)
{
const char *const orig_line = line;
@@ -266,6 +341,7 @@ static void parse_test_directive(struct shader_context *context, const char *lin
ID3D12GraphicsCommandList *command_list = context->c.list;
D3D12_ROOT_SIGNATURE_DESC root_signature_desc = {0};
D3D12_ROOT_PARAMETER root_params[3], *root_param;
+ D3D12_STATIC_SAMPLER_DESC static_samplers[1];
static const float clear_color[4];
unsigned int uniform_index;
ID3D12PipelineState *pso;
@@ -274,6 +350,8 @@ static void parse_test_directive(struct shader_context *context, const char *lin
root_signature_desc.NumParameters = 0;
root_signature_desc.pParameters = root_params;
+ root_signature_desc.NumStaticSamplers = 0;
+ root_signature_desc.pStaticSamplers = static_samplers;
if (context->uniform_count)
{
@@ -305,21 +383,40 @@ static void parse_test_directive(struct shader_context *context, const char *lin
range->RegisterSpace = 0;
range->OffsetInDescriptorsFromTableStart = 0;
- texture->heap = create_gpu_descriptor_heap(context->c.device, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
- texture->resource = create_default_texture(context->c.device, texture->width, texture->height,
- texture->format, 0, D3D12_RESOURCE_STATE_COPY_DEST);
- resource_data.pData = texture->data;
- resource_data.SlicePitch = resource_data.RowPitch = texture->width * texture->texel_size;
- upload_texture_data(texture->resource, &resource_data, 1, context->c.queue, command_list);
- reset_command_list(command_list, context->c.allocator);
- transition_resource_state(command_list, texture->resource, D3D12_RESOURCE_STATE_COPY_DEST,
- D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
- ID3D12Device_CreateShaderResourceView(context->c.device, texture->resource,
- NULL, get_cpu_descriptor_handle(&context->c, texture->heap, 0));
+ if (!texture->resource)
+ {
+ texture->heap = create_gpu_descriptor_heap(context->c.device,
+ D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, 1);
+ texture->resource = create_default_texture(context->c.device, texture->width, texture->height,
+ texture->format, 0, D3D12_RESOURCE_STATE_COPY_DEST);
+ resource_data.pData = texture->data;
+ resource_data.SlicePitch = resource_data.RowPitch = texture->width * texture->texel_size;
+ upload_texture_data(texture->resource, &resource_data, 1, context->c.queue, command_list);
+ reset_command_list(command_list, context->c.allocator);
+ transition_resource_state(command_list, texture->resource, D3D12_RESOURCE_STATE_COPY_DEST,
+ D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
+ ID3D12Device_CreateShaderResourceView(context->c.device, texture->resource,
+ NULL, get_cpu_descriptor_handle(&context->c, texture->heap, 0));
+ }
}
assert(root_signature_desc.NumParameters <= ARRAY_SIZE(root_params));
+ for (i = 0; i < context->sampler_count; ++i)
+ {
+ D3D12_STATIC_SAMPLER_DESC *sampler_desc = &static_samplers[root_signature_desc.NumStaticSamplers++];
+ const struct sampler *sampler = &context->samplers[i];
+
+ memset(sampler_desc, 0, sizeof(*sampler_desc));
+ sampler_desc->Filter = sampler->filter;
+ sampler_desc->AddressU = sampler->u_address;
+ sampler_desc->AddressV = sampler->v_address;
+ sampler_desc->AddressW = sampler->w_address;
+ sampler_desc->ShaderRegister = sampler->slot;
+ sampler_desc->RegisterSpace = 0;
+ sampler_desc->ShaderVisibility = D3D12_SHADER_VISIBILITY_ALL;
+ }
+
if (context->c.root_signature)
ID3D12RootSignature_Release(context->c.root_signature);
hr = create_root_signature(context->c.device, &root_signature_desc, &context->c.root_signature);
@@ -482,6 +579,22 @@ err:
fprintf(stderr, "Ignoring malformed line '%s'.\n", orig_line);
}
+static struct sampler *get_sampler(struct shader_context *context, unsigned int slot)
+{
+ struct sampler *sampler;
+ size_t i;
+
+ for (i = 0; i < context->sampler_count; ++i)
+ {
+ sampler = &context->samplers[i];
+
+ if (sampler->slot == slot)
+ return sampler;
+ }
+
+ return NULL;
+}
+
static struct texture *get_texture(struct shader_context *context, unsigned int slot)
{
struct texture *texture;
@@ -509,6 +622,7 @@ START_TEST(shader_runner_d3d12)
size_t shader_source_size = 0, shader_source_len = 0;
enum parse_state state = STATE_NONE;
unsigned int i, line_number = 0;
+ struct sampler *current_sampler;
struct texture *current_texture;
struct shader_context context;
const char *filename = NULL;
@@ -555,6 +669,7 @@ START_TEST(shader_runner_d3d12)
switch (state)
{
case STATE_NONE:
+ case STATE_SAMPLER:
case STATE_TEST:
case STATE_TEXTURE:
break;
@@ -650,11 +765,36 @@ START_TEST(shader_runner_d3d12)
if (!strcmp(line, "[pixel shader]\n"))
{
state = STATE_SHADER_PIXEL;
+
+ if (context.ps_code)
+ ID3D10Blob_Release(context.ps_code);
+ context.ps_code = NULL;
}
else if (!strcmp(line, "[pixel shader fail]\n"))
{
state = STATE_SHADER_INVALID_PIXEL;
}
+ else if (sscanf(line, "[sampler %u]\n", &index))
+ {
+ state = STATE_SAMPLER;
+
+ if ((current_sampler = get_sampler(&context, index)))
+ {
+ memset(current_sampler, 0, sizeof(*current_sampler));
+ }
+ else
+ {
+ context.samplers = realloc(context.samplers,
+ ++context.sampler_count * sizeof(*context.samplers));
+ current_sampler = &context.samplers[context.sampler_count - 1];
+ memset(current_sampler, 0, sizeof(*current_sampler));
+ }
+ current_sampler->slot = index;
+ current_sampler->filter = D3D12_FILTER_MIN_MAG_MIP_POINT;
+ current_sampler->u_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ current_sampler->v_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ current_sampler->w_address = D3D12_TEXTURE_ADDRESS_MODE_CLAMP;
+ }
else if (sscanf(line, "[texture %u]\n", &index))
{
state = STATE_TEXTURE;
@@ -711,6 +851,10 @@ START_TEST(shader_runner_d3d12)
break;
}
+ case STATE_SAMPLER:
+ parse_sampler_directive(current_sampler, line);
+ break;
+
case STATE_TEXTURE:
parse_texture_directive(current_texture, line);
break;
--
2.33.1
Nov. 2, 2021
[PATCH vkd3d 2/5] vkd3d-shader/hlsl: Write SM4 image load instructions.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl_sm4.c | 95 +++++++++++++++++++++++++++++++++---
1 file changed, 88 insertions(+), 7 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index f8eb0a1ef..5ab7df5f9 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -763,6 +763,7 @@ static unsigned int sm4_swizzle_type(enum vkd3d_sm4_register_type type)
case VKD3D_SM4_RT_CONSTBUFFER:
case VKD3D_SM4_RT_INPUT:
+ case VKD3D_SM4_RT_RESOURCE:
case VKD3D_SM4_RT_TEMP:
return VKD3D_SM4_SWIZZLE_VEC4;
@@ -779,14 +780,26 @@ static void sm4_register_from_deref(struct hlsl_ctx *ctx, struct sm4_register *r
if (var->is_uniform)
{
- unsigned int offset = hlsl_offset_from_deref(deref) + var->buffer_offset;
+ if (data_type->type == HLSL_CLASS_OBJECT && data_type->base_type == HLSL_TYPE_TEXTURE)
+ {
+ reg->type = VKD3D_SM4_RT_RESOURCE;
+ reg->dim = VKD3D_SM4_DIMENSION_VEC4;
+ 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;
- reg->type = VKD3D_SM4_RT_CONSTBUFFER;
- reg->dim = VKD3D_SM4_DIMENSION_VEC4;
- reg->idx[0] = var->buffer->reg.id;
- reg->idx[1] = offset / 4;
- reg->idx_count = 2;
- *writemask = ((1u << data_type->dimx) - 1) << (offset & 3);
+ assert(data_type->type <= HLSL_CLASS_VECTOR);
+ reg->type = VKD3D_SM4_RT_CONSTBUFFER;
+ reg->dim = VKD3D_SM4_DIMENSION_VEC4;
+ reg->idx[0] = var->buffer->reg.id;
+ reg->idx[1] = offset / 4;
+ reg->idx_count = 2;
+ *writemask = ((1u << data_type->dimx) - 1) << (offset & 3);
+ }
}
else if (var->is_input_semantic)
{
@@ -1154,6 +1167,50 @@ static void write_sm4_constant(struct hlsl_ctx *ctx,
write_sm4_instruction(buffer, &instr);
}
+static void write_sm4_ld(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_ir_node *coords)
+{
+ struct sm4_instruction instr;
+ unsigned int writemask;
+
+ memset(&instr, 0, sizeof(instr));
+ instr.opcode = VKD3D_SM4_OP_LD;
+
+ 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);
+
+ /* Mipmap level is in the last component in the IR, but needs to be in the W
+ * component in the instruction. */
+ switch (resource_type->sampler_dim)
+ {
+ case HLSL_SAMPLER_DIM_1D:
+ instr.srcs[0].swizzle = hlsl_combine_swizzles(instr.srcs[0].swizzle, HLSL_SWIZZLE(X, X, X, Y), 4);
+ break;
+
+ case HLSL_SAMPLER_DIM_2D:
+ instr.srcs[0].swizzle = hlsl_combine_swizzles(instr.srcs[0].swizzle, HLSL_SWIZZLE(X, Y, X, Z), 4);
+ break;
+
+ case HLSL_SAMPLER_DIM_3D:
+ case HLSL_SAMPLER_DIM_CUBE:
+ break;
+
+ case HLSL_SAMPLER_DIM_GENERIC:
+ assert(0);
+ }
+
+ 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);
+
+ instr.src_count = 2;
+
+ 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)
{
@@ -1375,6 +1432,26 @@ static void write_sm4_load(struct hlsl_ctx *ctx,
write_sm4_instruction(buffer, &instr);
}
+static void write_sm4_resource_load(struct hlsl_ctx *ctx,
+ struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_resource_load *load)
+{
+ const struct hlsl_type *resource_type = load->resource.var->data_type;
+ const struct hlsl_ir_node *coords = load->coords.node;
+
+ if (!load->resource.var->is_uniform)
+ {
+ hlsl_fixme(ctx, load->node.loc, "Load from non-uniform resource variable.");
+ return;
+ }
+
+ switch (load->load_type)
+ {
+ case HLSL_RESOURCE_LOAD:
+ write_sm4_ld(ctx, buffer, resource_type, &load->node, &load->resource, coords);
+ break;
+ }
+}
+
static void write_sm4_store(struct hlsl_ctx *ctx,
struct vkd3d_bytecode_buffer *buffer, const struct hlsl_ir_store *store)
{
@@ -1504,6 +1581,10 @@ static void write_sm4_shdr(struct hlsl_ctx *ctx,
write_sm4_load(ctx, &buffer, hlsl_ir_load(instr));
break;
+ case HLSL_IR_RESOURCE_LOAD:
+ write_sm4_resource_load(ctx, &buffer, hlsl_ir_resource_load(instr));
+ break;
+
case HLSL_IR_STORE:
write_sm4_store(ctx, &buffer, hlsl_ir_store(instr));
break;
--
2.33.1
Nov. 2, 2021
[PATCH vkd3d 1/5] vkd3d-shader/hlsl: Define a symbolic constant to represent the D3D_SIF_TEXTURE_COMPONENTS shift.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
libs/vkd3d-shader/hlsl_sm4.c | 2 +-
libs/vkd3d-shader/sm4.h | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index 9d45e1633..f8eb0a1ef 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -561,7 +561,7 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
put_u32(&buffer, sm4_resource_format(var->data_type));
put_u32(&buffer, sm4_rdef_resource_dimension(var->data_type));
put_u32(&buffer, ~0u); /* FIXME: multisample count */
- flags |= (var->data_type->e.resource_format->dimx - 1) << 2;
+ flags |= (var->data_type->e.resource_format->dimx - 1) << VKD3D_SM4_SIF_TEXTURE_COMPONENTS_SHIFT;
}
put_u32(&buffer, var->reg.id);
put_u32(&buffer, 1); /* bind count */
diff --git a/libs/vkd3d-shader/sm4.h b/libs/vkd3d-shader/sm4.h
index ddcb9a861..17a08ee27 100644
--- a/libs/vkd3d-shader/sm4.h
+++ b/libs/vkd3d-shader/sm4.h
@@ -526,4 +526,7 @@ enum vkd3d_sm4_shader_data_type
VKD3D_SM4_SHADER_DATA_MESSAGE = 0x4,
};
+/* The shift that corresponds to the D3D_SIF_TEXTURE_COMPONENTS mask. */
+#define VKD3D_SM4_SIF_TEXTURE_COMPONENTS_SHIFT 2
+
#endif /* __VKD3D_SM4_H */
--
2.33.1
Nov. 2, 2021
Re: [PATCH vkd3d 6/7] vkd3d-shader/hlsl: Don't bother synthesizing a temp for input or output variables if they're not written to or read from, respectively.
by Zebediah Figura (she/her)
On 10/26/21 07:48, Matteo Bruni wrote:
> On Fri, Oct 15, 2021 at 11:54 PM Zebediah Figura
> <zfigura(a)codeweavers.com> wrote:
>>
>> As a cheap substitute for actual variable copy-prop.
>>
>> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
>> ---
>> libs/vkd3d-shader/hlsl_codegen.c | 29 +++++++++++++++++++++++++++++
>> 1 file changed, 29 insertions(+)
>>
>> diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
>> index df10ca272..495ba7c47 100644
>> --- a/libs/vkd3d-shader/hlsl_codegen.c
>> +++ b/libs/vkd3d-shader/hlsl_codegen.c
>> @@ -34,6 +34,13 @@ static void prepend_uniform_copy(struct hlsl_ctx *ctx, struct list *instrs, stru
>> /* Use the synthetic name for the temp, rather than the uniform, so that we
>> * can write the uniform name into the shader reflection data. */
>>
>> + if (!temp->first_write)
>> + {
>> + temp->is_uniform = 1;
>> + list_add_tail(&ctx->extern_vars, &temp->extern_entry);
>> + return;
>> + }
>> +
>> if (!(uniform = hlsl_new_var(ctx, temp->name, temp->data_type, temp->loc, NULL, 0, &temp->reg_reservation)))
>> return;
>> list_add_before(&temp->scope_entry, &uniform->scope_entry);
>
> Technically this hunk is not covered by the patch subject.
>
> I'm not sure I love these checks being in the functions rather than in
> the caller. It might just be about function naming... I guess what's
> bugging me is that, for "good" uniforms, prepend_uniform_copy() will
> NOT prepend any copy but still do something significant.
It's a fair cop.
I suppose it could be renamed to lower_uniform_writes() etc...
>
>> @@ -67,6 +74,14 @@ static void prepend_input_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
>> struct hlsl_ir_load *load;
>> struct hlsl_ir_var *input;
>>
>> + /* We still need to split up non-vector types. */
>> + if (!var->first_write && var->data_type->type <= HLSL_CLASS_VECTOR)
>> + {
>> + var->is_input_semantic = 1;
>> + list_add_tail(&ctx->extern_vars, &var->extern_entry);
>> + return;
>> + }
>> +
>> if (!(name = hlsl_get_string_buffer(ctx)))
>> return;
>> vkd3d_string_buffer_printf(name, "<input-%s%u>", semantic->name, semantic->index);
>
> It's not obvious what splitting up input matrices (which is not there
> at all at the moment) has to do with adding a copy from an input
> variable.
Are input matrices even possible?
I'll have to clarify the comment in any case...
>
>> @@ -138,6 +153,14 @@ static void append_output_copy(struct hlsl_ctx *ctx, struct list *instrs, struct
>> struct hlsl_ir_var *output;
>> struct hlsl_ir_load *load;
>>
>> + /* We still need to split up non-vector types. */
>> + if (!var->last_read && var->data_type->type <= HLSL_CLASS_VECTOR)
>> + {
>> + var->is_output_semantic = 1;
>> + list_add_tail(&ctx->extern_vars, &var->extern_entry);
>> + return;
>> + }
>> +
>> if (!(name = hlsl_get_string_buffer(ctx)))
>> return;
>> vkd3d_string_buffer_printf(name, "<output-%s%u>", semantic->name, semantic->index);
>> @@ -1306,6 +1329,12 @@ int hlsl_emit_dxbc(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry_fun
>>
>> list_move_head(&body->instrs, &ctx->static_initializers);
>>
>> + /* Do an initial liveness pass for externs so that we don't create
>> + * unnecessary temps. Note that we might modify the instruction stream
>> + * during the pass, but we're only checking whether a variable was read to
>> + * or written from at all, so it's okay. */
>> + compute_liveness(ctx, entry_func);
>
> We shouldn't be modifying the instructions (aside from liveness data,
> of course) in compute_liveness(). I guess you mean that we can safely
> keep using liveness data that potentially becomes somewhat invalid
> during / after calling prepend_uniform_copy() /
> prepend_input_var_copy() / append_output_var_copy() but I'm having a
> hard time parsing the comment.
>
Er, right, "the pass" means the pass after compute_liveness()...
Clearly this patch needs more clarity.
Nov. 1, 2021