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
June 2018
- 68 participants
- 1149 messages
[PATCH v3 4/4] kernel32: Return chassis info from GetSystemFirmwareTable on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index d231f9b903..c3d19587ab 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -88,6 +88,17 @@ struct smbios_board {
BYTE serial;
};
+struct smbios_chassis {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE manufacturer;
+ BYTE shape;
+ BYTE version;
+ BYTE serial;
+ BYTE asset_tag;
+};
+
#include "poppack.h"
#define SHARED_DATA ((KSHARED_USER_DATA*)0x7ffe0000)
@@ -436,12 +447,15 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
size_t system_manufacturer_size, system_product_size, system_version_size, system_serial_size;
char *board_manufacturer, *board_product, *board_version, *board_serial;
size_t board_manufacturer_size, board_product_size, board_version_size, board_serial_size;
+ char *chassis_manufacturer, *chassis_version, *chassis_serial, *chassis_asset_tag;
+ size_t chassis_manufacturer_size, chassis_version_size, chassis_serial_size, chassis_asset_tag_size;
size_t required_size = sizeof(struct smbios_prologue);
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
struct smbios_board *board;
+ struct smbios_chassis *chassis;
bios_manufacturer = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_manufacturer_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
@@ -454,6 +468,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size);
board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size);
board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size);
+ chassis_manufacturer = get_smbios_string("/sys/class/dmi/id/chassis_vendor", &chassis_manufacturer_size);
+ chassis_version = get_smbios_string("/sys/class/dmi/id/chassis_version", &chassis_version_size);
+ chassis_serial = get_smbios_string("/sys/class/dmi/id/chassis_serial", &chassis_serial_size);
+ chassis_asset_tag = get_smbios_string("/sys/class/dmi/id/chassis_tag", &chassis_asset_tag_size);
required_size += sizeof(struct smbios_bios);
required_size += max(bios_manufacturer_size + bios_version_size + bios_date_size + 1, 2);
@@ -466,6 +484,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
required_size += max(board_manufacturer_size + board_product_size + board_version_size +
board_serial_size + 1, 2);
+ required_size += sizeof(struct smbios_chassis);
+ required_size += max(chassis_manufacturer_size + chassis_version_size + chassis_serial_size +
+ chassis_asset_tag_size + 1, 2);
+
if (required_size > size)
return required_size;
@@ -548,6 +570,33 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
copy_smbios_string(&buffer, board_version, board_version_size);
copy_smbios_string(&buffer, board_serial, board_serial_size);
memset(buffer, 0, 1);
+ buffer = (char*)buffer + 1;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer = (char*)buffer + 2;
+ }
+
+ string_count = 0;
+ chassis = (struct smbios_chassis*)buffer;
+ chassis->type = 3;
+ chassis->length = sizeof(struct smbios_chassis);
+ chassis->handle = 0;
+ chassis->manufacturer = chassis_manufacturer ? ++string_count : 0;
+ chassis->shape = 0x2; /* unknown */
+ chassis->version = chassis_version ? ++string_count : 0;
+ chassis->serial = chassis_serial ? ++string_count : 0;
+ chassis->asset_tag = chassis_asset_tag ? ++string_count : 0;
+ buffer = (char*)buffer + sizeof(struct smbios_chassis);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, chassis_manufacturer, chassis_manufacturer_size);
+ copy_smbios_string(&buffer, chassis_version, chassis_version_size);
+ copy_smbios_string(&buffer, chassis_serial, chassis_serial_size);
+ copy_smbios_string(&buffer, chassis_asset_tag, chassis_asset_tag_size);
+ memset(buffer, 0, 1);
}
else
{
@@ -565,6 +614,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
free(board_product);
free(board_version);
free(board_serial);
+ free(chassis_manufacturer);
+ free(chassis_version);
+ free(chassis_serial);
+ free(chassis_asset_tag);
return required_size;
#endif
--
2.17.1
June 13, 2018
[PATCH v3 3/4] kernel32: Return board info from GetSystemFirmwareTable on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 51 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 95eea25a57..d231f9b903 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -78,6 +78,16 @@ struct smbios_system {
BYTE serial;
};
+struct smbios_board {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE manufacturer;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
#define SHARED_DATA ((KSHARED_USER_DATA*)0x7ffe0000)
@@ -424,11 +434,14 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
size_t bios_manufacturer_size, bios_version_size, bios_date_size;
char *system_manufacturer, *system_product, *system_version, *system_serial;
size_t system_manufacturer_size, system_product_size, system_version_size, system_serial_size;
+ char *board_manufacturer, *board_product, *board_version, *board_serial;
+ size_t board_manufacturer_size, board_product_size, board_version_size, board_serial_size;
size_t required_size = sizeof(struct smbios_prologue);
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
struct smbios_system *system;
+ struct smbios_board *board;
bios_manufacturer = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_manufacturer_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
@@ -437,6 +450,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size);
system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size);
system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size);
+ board_manufacturer = get_smbios_string("/sys/class/dmi/id/board_vendor", &board_manufacturer_size);
+ board_product = get_smbios_string("/sys/class/dmi/id/board_name", &board_product_size);
+ board_version = get_smbios_string("/sys/class/dmi/id/board_version", &board_version_size);
+ board_serial = get_smbios_string("/sys/class/dmi/id/board_serial", &board_serial_size);
required_size += sizeof(struct smbios_bios);
required_size += max(bios_manufacturer_size + bios_version_size + bios_date_size + 1, 2);
@@ -445,6 +462,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
required_size += max(system_manufacturer_size + system_product_size + system_version_size +
system_serial_size + 1, 2);
+ required_size += sizeof(struct smbios_board);
+ required_size += max(board_manufacturer_size + board_product_size + board_version_size +
+ board_serial_size + 1, 2);
+
if (required_size > size)
return required_size;
@@ -501,6 +522,32 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
copy_smbios_string(&buffer, system_version, system_version_size);
copy_smbios_string(&buffer, system_serial, system_serial_size);
memset(buffer, 0, 1);
+ buffer = (char*)buffer + 1;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer = (char*)buffer + 2;
+ }
+
+ string_count = 0;
+ board = (struct smbios_board*)buffer;
+ board->type = 2;
+ board->length = sizeof(struct smbios_board);
+ board->handle = 0;
+ board->manufacturer = board_manufacturer ? ++string_count : 0;
+ board->product = board_product ? ++string_count : 0;
+ board->version = board_version ? ++string_count : 0;
+ board->serial = board_serial ? ++string_count : 0;
+ buffer = (char*)buffer + sizeof(struct smbios_board);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, board_manufacturer, board_manufacturer_size);
+ copy_smbios_string(&buffer, board_product, board_product_size);
+ copy_smbios_string(&buffer, board_version, board_version_size);
+ copy_smbios_string(&buffer, board_serial, board_serial_size);
+ memset(buffer, 0, 1);
}
else
{
@@ -514,6 +561,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
free(system_product);
free(system_version);
free(system_serial);
+ free(board_manufacturer);
+ free(board_product);
+ free(board_version);
+ free(board_serial);
return required_size;
#endif
--
2.17.1
June 13, 2018
[PATCH v3 2/4] kernel32: Return system info from GetSystemFirmwareTable on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 51 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 4dd9bb628a..95eea25a57 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -68,6 +68,16 @@ struct smbios_bios {
UINT64 characteristics;
};
+struct smbios_system {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE manufacturer;
+ BYTE product;
+ BYTE version;
+ BYTE serial;
+};
+
#include "poppack.h"
#define SHARED_DATA ((KSHARED_USER_DATA*)0x7ffe0000)
@@ -412,18 +422,29 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
#ifdef linux
char *bios_manufacturer, *bios_version, *bios_date;
size_t bios_manufacturer_size, bios_version_size, bios_date_size;
+ char *system_manufacturer, *system_product, *system_version, *system_serial;
+ size_t system_manufacturer_size, system_product_size, system_version_size, system_serial_size;
size_t required_size = sizeof(struct smbios_prologue);
BYTE string_count;
struct smbios_prologue *prologue;
struct smbios_bios *bios;
+ struct smbios_system *system;
bios_manufacturer = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_manufacturer_size);
bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
+ system_manufacturer = get_smbios_string("/sys/class/dmi/id/sys_vendor", &system_manufacturer_size);
+ system_product = get_smbios_string("/sys/class/dmi/id/product", &system_product_size);
+ system_version = get_smbios_string("/sys/class/dmi/id/product_version", &system_version_size);
+ system_serial = get_smbios_string("/sys/class/dmi/id/product_serial", &system_serial_size);
required_size += sizeof(struct smbios_bios);
required_size += max(bios_manufacturer_size + bios_version_size + bios_date_size + 1, 2);
+ required_size += sizeof(struct smbios_system);
+ required_size += max(system_manufacturer_size + system_product_size + system_version_size +
+ system_serial_size + 1, 2);
+
if (required_size > size)
return required_size;
@@ -454,6 +475,32 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
copy_smbios_string(&buffer, bios_version, bios_version_size);
copy_smbios_string(&buffer, bios_date, bios_date_size);
memset(buffer, 0, 1);
+ buffer = (char*)buffer + 1;
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ buffer = (char*)buffer + 2;
+ }
+
+ string_count = 0;
+ system = (struct smbios_system*)buffer;
+ system->type = 1;
+ system->length = sizeof(struct smbios_system);
+ system->handle = 0;
+ system->manufacturer = system_manufacturer ? ++string_count : 0;
+ system->product = system_product ? ++string_count : 0;
+ system->version = system_version ? ++string_count : 0;
+ system->serial = system_serial ? ++string_count : 0;
+ buffer = (char*)buffer + sizeof(struct smbios_system);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, system_manufacturer, system_manufacturer_size);
+ copy_smbios_string(&buffer, system_product, system_product_size);
+ copy_smbios_string(&buffer, system_version, system_version_size);
+ copy_smbios_string(&buffer, system_serial, system_serial_size);
+ memset(buffer, 0, 1);
}
else
{
@@ -463,6 +510,10 @@ UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD
free(bios_manufacturer);
free(bios_version);
free(bios_date);
+ free(system_manufacturer);
+ free(system_product);
+ free(system_version);
+ free(system_serial);
return required_size;
#endif
--
2.17.1
June 13, 2018
[PATCH v3 1/4] kernel32: Return BIOS info from GetSystemFirmwareTable on Linux
by Alex Henrie
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/kernel32/cpu.c | 135 ++++++++++++++++++++++++++++++++++++++++
dlls/kernel32/process.c | 10 ---
2 files changed, 135 insertions(+), 10 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index ec1fd0f90d..4dd9bb628a 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -46,8 +46,37 @@
WINE_DEFAULT_DEBUG_CHANNEL(reg);
+#include "pshpack1.h"
+
+struct smbios_prologue {
+ BYTE calling_method;
+ BYTE major_version;
+ BYTE minor_version;
+ BYTE revision;
+ DWORD length;
+};
+
+struct smbios_bios {
+ BYTE type;
+ BYTE length;
+ WORD handle;
+ BYTE manufacturer;
+ BYTE version;
+ WORD start;
+ BYTE date;
+ BYTE size;
+ UINT64 characteristics;
+};
+
+#include "poppack.h"
+
#define SHARED_DATA ((KSHARED_USER_DATA*)0x7ffe0000)
+/* Firmware table providers */
+#define ACPI 0x41435049
+#define FIRM 0x4649524D
+#define RSMB 0x52534D42
+
/****************************************************************************
* QueryPerformanceCounter (KERNEL32.@)
*
@@ -336,3 +365,109 @@ DWORD64 WINAPI GetEnabledXStateFeatures(void)
FIXME("\n");
return 0;
}
+
+static inline void copy_smbios_string(void **buffer, char *string, size_t string_size)
+{
+ if (!string) return;
+ strcpy(*buffer, string);
+ *buffer = (char*)(*buffer) + string_size;
+}
+
+#ifdef linux
+static char* get_smbios_string(const char *path, size_t *string_size)
+{
+ FILE *file = fopen(path, "r");
+ char *ret = NULL;
+ *string_size = 0;
+ if (file)
+ {
+ *string_size = getline(&ret, string_size, file) + 1;
+ fclose(file);
+ if (*string_size >= 2 && ret[*string_size - 2] == '\n')
+ {
+ ret[*string_size - 2] = 0;
+ (*string_size)--;
+ }
+ if (*string_size == 1)
+ {
+ free(ret);
+ ret = NULL;
+ *string_size = 0;
+ }
+ }
+ return ret;
+}
+#endif
+
+/***********************************************************************
+ * GetSystemFirmwareTable (KERNEL32.@)
+ */
+UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, void *buffer, DWORD size)
+{
+ FIXME("(%08x %08x %p %d): semi-stub\n", provider, id, buffer, size);
+ switch (provider)
+ {
+ case RSMB:
+ {
+#ifdef linux
+ char *bios_manufacturer, *bios_version, *bios_date;
+ size_t bios_manufacturer_size, bios_version_size, bios_date_size;
+ size_t required_size = sizeof(struct smbios_prologue);
+ BYTE string_count;
+ struct smbios_prologue *prologue;
+ struct smbios_bios *bios;
+
+ bios_manufacturer = get_smbios_string("/sys/class/dmi/id/bios_vendor", &bios_manufacturer_size);
+ bios_version = get_smbios_string("/sys/class/dmi/id/bios_version", &bios_version_size);
+ bios_date = get_smbios_string("/sys/class/dmi/id/bios_date", &bios_date_size);
+
+ required_size += sizeof(struct smbios_bios);
+ required_size += max(bios_manufacturer_size + bios_version_size + bios_date_size + 1, 2);
+
+ if (required_size > size)
+ return required_size;
+
+ prologue = (struct smbios_prologue*)buffer;
+ prologue->calling_method = 0;
+ prologue->major_version = 2;
+ prologue->minor_version = 0;
+ prologue->revision = 0;
+ prologue->length = required_size - sizeof(struct smbios_prologue);
+ buffer = (char*)buffer + sizeof(struct smbios_prologue);
+
+ string_count = 0;
+ bios = (struct smbios_bios*)buffer;
+ bios->type = 0;
+ bios->length = sizeof(struct smbios_bios);
+ bios->handle = 0;
+ bios->manufacturer = bios_manufacturer ? ++string_count : 0;
+ bios->version = bios_version ? ++string_count : 0;
+ bios->start = 0;
+ bios->date = bios_date ? ++string_count : 0;
+ bios->size = 0;
+ bios->characteristics = 0x4; /* not supported */
+ buffer = (char*)buffer + sizeof(struct smbios_bios);
+
+ if (string_count)
+ {
+ copy_smbios_string(&buffer, bios_manufacturer, bios_manufacturer_size);
+ copy_smbios_string(&buffer, bios_version, bios_version_size);
+ copy_smbios_string(&buffer, bios_date, bios_date_size);
+ memset(buffer, 0, 1);
+ }
+ else
+ {
+ memset(buffer, 0, 2);
+ }
+
+ free(bios_manufacturer);
+ free(bios_version);
+ free(bios_date);
+
+ return required_size;
+#endif
+ }
+ }
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return 0;
+}
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c
index ff56e9a692..6adf08d257 100644
--- a/dlls/kernel32/process.c
+++ b/dlls/kernel32/process.c
@@ -4126,16 +4126,6 @@ HRESULT WINAPI UnregisterApplicationRestart(void)
return S_OK;
}
-/***********************************************************************
- * GetSystemFirmwareTable (KERNEL32.@)
- */
-UINT WINAPI GetSystemFirmwareTable(DWORD provider, DWORD id, PVOID buffer, DWORD size)
-{
- FIXME("(%d %d %p %d):stub\n", provider, id, buffer, size);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
-}
-
struct proc_thread_attr
{
DWORD_PTR attr;
--
2.17.1
June 13, 2018
[PATCH 2/2] mshtml.idl: Added IHTMLPerformance test.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/mshtml/tests/dom.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
June 13, 2018
[PATCH 1/2] mshtml.idl: Added IHTMLPerformance declaration.
by Jacek Caban
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
include/mshtmdid.h | 40 +++++++++++++++++
include/mshtml.idl | 129
+++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 169 insertions(+)
June 13, 2018
[v2 PATCH] user32: Fix returned class name for other process windows.
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
Fixes https://bugs.winehq.org/show_bug.cgi?id=45156
v2: using existing request
dlls/user32/class.c | 14 +++++++++++++-
include/wine/server_protocol.h | 8 +++++---
server/class.c | 1 +
server/protocol.def | 5 +++--
server/request.h | 13 +++++++------
server/trace.c | 5 +++--
6 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/dlls/user32/class.c b/dlls/user32/class.c
index 2b2d07f888..07d36f05d7 100644
--- a/dlls/user32/class.c
+++ b/dlls/user32/class.c
@@ -1194,8 +1194,20 @@ INT WINAPI GetClassNameW( HWND hwnd, LPWSTR buffer, INT count )
if (class == CLASS_OTHER_PROCESS)
{
WCHAR tmpbuf[MAX_ATOM_LEN + 1];
+ ATOM atom = 0;
- ret = GlobalGetAtomNameW( GetClassLongW( hwnd, GCW_ATOM ), tmpbuf, MAX_ATOM_LEN + 1 );
+ SERVER_START_REQ( set_class_info )
+ {
+ req->window = wine_server_user_handle( hwnd );
+ req->flags = 0;
+ req->extra_offset = -1;
+ req->extra_size = 0;
+ if (!wine_server_call_err( req ))
+ atom = reply->base_atom;
+ }
+ SERVER_END_REQ;
+
+ ret = GlobalGetAtomNameW( atom, tmpbuf, MAX_ATOM_LEN + 1 );
if (ret)
{
ret = min(count - 1, ret);
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index e4c2d92376..511ad5c628 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -4525,11 +4525,13 @@ struct set_class_info_reply
{
struct reply_header __header;
atom_t old_atom;
+ atom_t base_atom;
+ mod_handle_t old_instance;
+ lparam_t old_extra_value;
unsigned int old_style;
int old_extra;
int old_win_extra;
- mod_handle_t old_instance;
- lparam_t old_extra_value;
+ char __pad_44[4];
};
#define SET_CLASS_ATOM 0x0001
#define SET_CLASS_STYLE 0x0002
@@ -6512,6 +6514,6 @@ union generic_reply
struct terminate_job_reply terminate_job_reply;
};
-#define SERVER_PROTOCOL_VERSION 554
+#define SERVER_PROTOCOL_VERSION 555
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/class.c b/server/class.c
index d5f6712006..6a7de7843e 100644
--- a/server/class.c
+++ b/server/class.c
@@ -276,6 +276,7 @@ DECL_HANDLER(set_class_info)
reply->old_extra = class->nb_extra_bytes;
reply->old_win_extra = class->win_extra;
reply->old_instance = class->instance;
+ reply->base_atom = class->base_atom;
if (req->flags & SET_CLASS_ATOM)
{
diff --git a/server/protocol.def b/server/protocol.def
index c533f1b8eb..5d89c2b3ba 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3179,11 +3179,12 @@ enum caret_state
lparam_t extra_value; /* value to set in extra bytes */
@REPLY
atom_t old_atom; /* previous class atom */
+ atom_t base_atom; /* base class atom */
+ mod_handle_t old_instance; /* previous module instance */
+ lparam_t old_extra_value; /* old value in extra bytes */
unsigned int old_style; /* previous class style */
int old_extra; /* previous number of class extra bytes */
int old_win_extra; /* previous number of window extra bytes */
- mod_handle_t old_instance; /* previous module instance */
- lparam_t old_extra_value; /* old value in extra bytes */
@END
#define SET_CLASS_ATOM 0x0001
#define SET_CLASS_STYLE 0x0002
diff --git a/server/request.h b/server/request.h
index 8b823ba844..10fd850ec1 100644
--- a/server/request.h
+++ b/server/request.h
@@ -2056,12 +2056,13 @@ C_ASSERT( FIELD_OFFSET(struct set_class_info_request, extra_size) == 44 );
C_ASSERT( FIELD_OFFSET(struct set_class_info_request, extra_value) == 48 );
C_ASSERT( sizeof(struct set_class_info_request) == 56 );
C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_atom) == 8 );
-C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_style) == 12 );
-C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_extra) == 16 );
-C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_win_extra) == 20 );
-C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_instance) == 24 );
-C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_extra_value) == 32 );
-C_ASSERT( sizeof(struct set_class_info_reply) == 40 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, base_atom) == 12 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_instance) == 16 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_extra_value) == 24 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_style) == 32 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_extra) == 36 );
+C_ASSERT( FIELD_OFFSET(struct set_class_info_reply, old_win_extra) == 40 );
+C_ASSERT( sizeof(struct set_class_info_reply) == 48 );
C_ASSERT( FIELD_OFFSET(struct open_clipboard_request, window) == 12 );
C_ASSERT( sizeof(struct open_clipboard_request) == 16 );
C_ASSERT( FIELD_OFFSET(struct open_clipboard_reply, owner) == 8 );
diff --git a/server/trace.c b/server/trace.c
index c6020433f1..e6ed964e16 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -3795,11 +3795,12 @@ static void dump_set_class_info_request( const struct set_class_info_request *re
static void dump_set_class_info_reply( const struct set_class_info_reply *req )
{
fprintf( stderr, " old_atom=%04x", req->old_atom );
+ fprintf( stderr, ", base_atom=%04x", req->base_atom );
+ dump_uint64( ", old_instance=", &req->old_instance );
+ dump_uint64( ", old_extra_value=", &req->old_extra_value );
fprintf( stderr, ", old_style=%08x", req->old_style );
fprintf( stderr, ", old_extra=%d", req->old_extra );
fprintf( stderr, ", old_win_extra=%d", req->old_win_extra );
- dump_uint64( ", old_instance=", &req->old_instance );
- dump_uint64( ", old_extra_value=", &req->old_extra_value );
}
static void dump_open_clipboard_request( const struct open_clipboard_request *req )
--
2.17.1
June 13, 2018
[PATCH 6/6] dxgi: Get supported feature levels from wined3d caps.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
Not much better yet...
The main idea behind the series is to separate feature level checks from
shader model checks in wined3d.
On a side note, handling of feature levels 9_x appears to be incorrect
(AFAIK feature levels 9_x always use SM2 shaders).
---
dlls/dxgi/utils.c | 34 ++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index a30528193162..aed62a4a3b36 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -626,21 +626,20 @@ D3D_FEATURE_LEVEL dxgi_check_feature_level_support(struct dxgi_factory *factory,
{
static const struct
{
- D3D_FEATURE_LEVEL feature_level;
- unsigned int sm;
+ D3D_FEATURE_LEVEL d3d;
+ enum wined3d_feature_level wined3d;
}
- feature_levels_sm[] =
+ wined3d_feature_levels[] =
{
- {D3D_FEATURE_LEVEL_11_1, 5},
- {D3D_FEATURE_LEVEL_11_0, 5},
- {D3D_FEATURE_LEVEL_10_1, 4},
- {D3D_FEATURE_LEVEL_10_0, 4},
- {D3D_FEATURE_LEVEL_9_3, 3},
- {D3D_FEATURE_LEVEL_9_2, 2},
- {D3D_FEATURE_LEVEL_9_1, 2},
+ {D3D_FEATURE_LEVEL_11_1, WINED3D_FEATURE_LEVEL_11},
+ {D3D_FEATURE_LEVEL_11_0, WINED3D_FEATURE_LEVEL_11},
+ {D3D_FEATURE_LEVEL_10_1, WINED3D_FEATURE_LEVEL_10},
+ {D3D_FEATURE_LEVEL_10_0, WINED3D_FEATURE_LEVEL_10},
+ {D3D_FEATURE_LEVEL_9_3, WINED3D_FEATURE_LEVEL_9_SM3},
+ {D3D_FEATURE_LEVEL_9_2, WINED3D_FEATURE_LEVEL_9_SM2},
+ {D3D_FEATURE_LEVEL_9_1, WINED3D_FEATURE_LEVEL_9_SM2},
};
D3D_FEATURE_LEVEL selected_feature_level = 0;
- unsigned int shader_model;
struct wined3d_caps caps;
unsigned int i, j;
HRESULT hr;
@@ -652,18 +651,17 @@ D3D_FEATURE_LEVEL dxgi_check_feature_level_support(struct dxgi_factory *factory,
if (FAILED(hr))
level_count = 0;
- shader_model = min(caps.VertexShaderVersion, caps.PixelShaderVersion);
for (i = 0; i < level_count; ++i)
{
- for (j = 0; j < ARRAY_SIZE(feature_levels_sm); ++j)
+ for (j = 0; j < ARRAY_SIZE(wined3d_feature_levels); ++j)
{
- if (feature_levels[i] == feature_levels_sm[j].feature_level)
+ if (feature_levels[i] == wined3d_feature_levels[j].d3d)
{
- if (shader_model >= feature_levels_sm[j].sm)
+ if (caps.max_feature_level >= wined3d_feature_levels[j].wined3d)
{
selected_feature_level = feature_levels[i];
- TRACE("Choosing supported feature level %s (SM%u).\n",
- debug_feature_level(selected_feature_level), feature_levels_sm[j].sm);
+ TRACE("Choosing supported feature level %s.\n",
+ debug_feature_level(selected_feature_level));
}
break;
}
@@ -671,7 +669,7 @@ D3D_FEATURE_LEVEL dxgi_check_feature_level_support(struct dxgi_factory *factory,
if (selected_feature_level)
break;
- if (j == ARRAY_SIZE(feature_levels_sm))
+ if (j == ARRAY_SIZE(wined3d_feature_levels))
FIXME("Unexpected feature level %#x.\n", feature_levels[i]);
else
TRACE("Feature level %s not supported, trying next fallback if available.\n",
--
2.16.4
June 13, 2018
[PATCH 5/6] wined3d: Expose feature level in wined3d caps.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/directx.c | 2 ++
dlls/wined3d/wined3d_private.h | 13 -------------
include/wine/wined3d.h | 15 +++++++++++++++
3 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 7046060d5249..9ecc4ed71354 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -6190,6 +6190,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->shader_double_precision = d3d_info->shader_double_precision;
+ caps->max_feature_level = d3d_info->feature_level;
+
return WINED3D_OK;
}
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 01888469e7a8..9aa70817f5d1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -184,19 +184,6 @@ struct wined3d_ffp_attrib_ops
wined3d_generic_attrib_func generic[WINED3D_FFP_EMIT_COUNT];
};
-enum wined3d_feature_level
-{
- WINED3D_FEATURE_LEVEL_5,
- WINED3D_FEATURE_LEVEL_6,
- WINED3D_FEATURE_LEVEL_7,
- WINED3D_FEATURE_LEVEL_8,
- WINED3D_FEATURE_LEVEL_9_SM2,
- WINED3D_FEATURE_LEVEL_9_SM3,
- WINED3D_FEATURE_LEVEL_10,
- WINED3D_FEATURE_LEVEL_11,
- WINED3D_FEATURE_LEVEL_COUNT
-};
-
struct wined3d_d3d_info
{
struct wined3d_d3d_limits limits;
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 0f388ab2a198..239ccd8ec62a 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -88,6 +88,19 @@ enum wined3d_device_type
WINED3D_DEVICE_TYPE_NULLREF = 4,
};
+enum wined3d_feature_level
+{
+ WINED3D_FEATURE_LEVEL_5,
+ WINED3D_FEATURE_LEVEL_6,
+ WINED3D_FEATURE_LEVEL_7,
+ WINED3D_FEATURE_LEVEL_8,
+ WINED3D_FEATURE_LEVEL_9_SM2,
+ WINED3D_FEATURE_LEVEL_9_SM3,
+ WINED3D_FEATURE_LEVEL_10,
+ WINED3D_FEATURE_LEVEL_11,
+ WINED3D_FEATURE_LEVEL_COUNT
+};
+
enum wined3d_degree_type
{
WINED3D_DEGREE_LINEAR = 1,
@@ -1962,6 +1975,8 @@ struct wined3d_caps
struct wined3d_ddraw_caps ddraw_caps;
BOOL shader_double_precision;
+
+ enum wined3d_feature_level max_feature_level;
};
struct wined3d_color_key
--
2.16.4
June 13, 2018
[PATCH 4/6] wined3d: Store feature level in d3d_info.
by Józef Kucia
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/directx.c | 107 ++++++++++++++++++-----------------------
dlls/wined3d/wined3d_private.h | 14 ++++++
2 files changed, 62 insertions(+), 59 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index e64df4f75f75..7046060d5249 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -77,19 +77,6 @@ enum wined3d_gl_vendor
GL_VENDOR_NVIDIA,
};
-enum wined3d_d3d_level
-{
- WINED3D_D3D_LEVEL_5,
- WINED3D_D3D_LEVEL_6,
- WINED3D_D3D_LEVEL_7,
- WINED3D_D3D_LEVEL_8,
- WINED3D_D3D_LEVEL_9_SM2,
- WINED3D_D3D_LEVEL_9_SM3,
- WINED3D_D3D_LEVEL_10,
- WINED3D_D3D_LEVEL_11,
- WINED3D_D3D_LEVEL_COUNT
-};
-
/* The d3d device ID */
static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
@@ -1857,26 +1844,26 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
return HW_VENDOR_NVIDIA;
}
-static enum wined3d_d3d_level d3d_level_from_caps(const struct shader_caps *shader_caps,
+static enum wined3d_feature_level feature_level_from_caps(const struct shader_caps *shader_caps,
const struct fragment_caps *fragment_caps)
{
if (shader_caps->vs_version >= 5)
- return WINED3D_D3D_LEVEL_11;
+ return WINED3D_FEATURE_LEVEL_11;
if (shader_caps->vs_version == 4)
- return WINED3D_D3D_LEVEL_10;
+ return WINED3D_FEATURE_LEVEL_10;
if (shader_caps->vs_version == 3)
- return WINED3D_D3D_LEVEL_9_SM3;
+ return WINED3D_FEATURE_LEVEL_9_SM3;
if (shader_caps->vs_version == 2)
- return WINED3D_D3D_LEVEL_9_SM2;
+ return WINED3D_FEATURE_LEVEL_9_SM2;
if (shader_caps->vs_version == 1)
- return WINED3D_D3D_LEVEL_8;
+ return WINED3D_FEATURE_LEVEL_8;
if (fragment_caps->TextureOpCaps & WINED3DTEXOPCAPS_DOTPRODUCT3)
- return WINED3D_D3D_LEVEL_7;
+ return WINED3D_FEATURE_LEVEL_7;
if (fragment_caps->MaxSimultaneousTextures > 1)
- return WINED3D_D3D_LEVEL_6;
+ return WINED3D_FEATURE_LEVEL_6;
- return WINED3D_D3D_LEVEL_5;
+ return WINED3D_FEATURE_LEVEL_5;
}
static const struct wined3d_renderer_table
@@ -2448,9 +2435,9 @@ card_fallback_intel[] =
CARD_INTEL_G45, /* D3D10 */
CARD_INTEL_IVBD, /* D3D11 */
};
-C_ASSERT(ARRAY_SIZE(card_fallback_nvidia) == WINED3D_D3D_LEVEL_COUNT);
-C_ASSERT(ARRAY_SIZE(card_fallback_amd) == WINED3D_D3D_LEVEL_COUNT);
-C_ASSERT(ARRAY_SIZE(card_fallback_intel) == WINED3D_D3D_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_nvidia) == WINED3D_FEATURE_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_amd) == WINED3D_FEATURE_LEVEL_COUNT);
+C_ASSERT(ARRAY_SIZE(card_fallback_intel) == WINED3D_FEATURE_LEVEL_COUNT);
static enum wined3d_pci_device select_card_handler(const struct gl_vendor_selection *table,
unsigned int table_size, enum wined3d_gl_vendor gl_vendor, const char *gl_renderer)
@@ -2483,7 +2470,7 @@ static const struct
const char *description; /* Description of the card selector i.e. Apple OS/X Intel */
const struct gl_vendor_selection *gl_vendor_selection;
unsigned int gl_vendor_count;
- const enum wined3d_pci_device *card_fallback; /* An array with D3D_LEVEL_COUNT elements */
+ const enum wined3d_pci_device *card_fallback; /* An array with FEATURE_LEVEL_COUNT elements */
}
card_vendor_table[] =
{
@@ -2501,9 +2488,9 @@ card_vendor_table[] =
card_fallback_intel},
};
-
-static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shader_caps, const struct fragment_caps *fragment_caps,
- DWORD glsl_version, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor, enum wined3d_pci_vendor *card_vendor)
+static enum wined3d_pci_device wined3d_guess_card(enum wined3d_feature_level feature_level,
+ DWORD glsl_version, const char *gl_renderer, enum wined3d_gl_vendor *gl_vendor,
+ enum wined3d_pci_vendor *card_vendor)
{
/* A Direct3D device object contains the PCI id (vendor + device) of the
* videocard which is used for rendering. Various applications use this
@@ -2555,7 +2542,6 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
* memory behind our backs if really needed. Note that the amount of video
* memory can be overruled using a registry setting. */
- enum wined3d_d3d_level d3d_level = d3d_level_from_caps(shader_caps, fragment_caps);
enum wined3d_pci_device device;
unsigned int i;
@@ -2571,7 +2557,7 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
return device;
TRACE("Unrecognized renderer %s, falling back to default.\n", debugstr_a(gl_renderer));
- return card_vendor_table[i].card_fallback[d3d_level];
+ return card_vendor_table[i].card_fallback[feature_level];
}
FIXME("No card selector available for card vendor %04x (using GL_RENDERER %s).\n",
@@ -2579,7 +2565,7 @@ static enum wined3d_pci_device wined3d_guess_card(const struct shader_caps *shad
/* Default to generic Nvidia hardware based on the supported OpenGL extensions. */
*card_vendor = HW_VENDOR_NVIDIA;
- return card_fallback_nvidia[d3d_level];
+ return card_fallback_nvidia[feature_level];
}
static const struct wined3d_vertex_pipe_ops *select_vertex_implementation(const struct wined3d_gl_info *gl_info,
@@ -3954,6 +3940,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
};
struct wined3d_driver_info *driver_info = &adapter->driver_info;
const char *gl_vendor_str, *gl_renderer_str, *gl_version_str;
+ struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
struct wined3d_gl_info *gl_info = &adapter->gl_info;
const struct gpu_description *gpu_description;
struct wined3d_vertex_caps vertex_caps;
@@ -3962,10 +3949,10 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
const char *WGL_Extensions = NULL;
enum wined3d_gl_vendor gl_vendor;
DWORD gl_version, gl_ext_emul_mask;
+ GLint context_profile = 0;
UINT64 vram_bytes = 0;
- HDC hdc;
unsigned int i, j;
- GLint context_profile = 0;
+ HDC hdc;
TRACE("adapter %p.\n", adapter);
@@ -4295,37 +4282,39 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
adapter->fragment_pipe = select_fragment_implementation(gl_info, adapter->shader_backend);
adapter->shader_backend->shader_get_caps(gl_info, &shader_caps);
- adapter->d3d_info.vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
- adapter->d3d_info.limits.vs_version = shader_caps.vs_version;
- adapter->d3d_info.limits.hs_version = shader_caps.hs_version;
- adapter->d3d_info.limits.ds_version = shader_caps.ds_version;
- adapter->d3d_info.limits.gs_version = shader_caps.gs_version;
- adapter->d3d_info.limits.ps_version = shader_caps.ps_version;
- adapter->d3d_info.limits.cs_version = shader_caps.cs_version;
- adapter->d3d_info.limits.vs_uniform_count = shader_caps.vs_uniform_count;
- adapter->d3d_info.limits.ps_uniform_count = shader_caps.ps_uniform_count;
- adapter->d3d_info.limits.varying_count = shader_caps.varying_count;
- adapter->d3d_info.shader_double_precision = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION;
+ d3d_info->vs_clipping = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_VS_CLIPPING;
+ d3d_info->limits.vs_version = shader_caps.vs_version;
+ d3d_info->limits.hs_version = shader_caps.hs_version;
+ d3d_info->limits.ds_version = shader_caps.ds_version;
+ d3d_info->limits.gs_version = shader_caps.gs_version;
+ d3d_info->limits.ps_version = shader_caps.ps_version;
+ d3d_info->limits.cs_version = shader_caps.cs_version;
+ d3d_info->limits.vs_uniform_count = shader_caps.vs_uniform_count;
+ d3d_info->limits.ps_uniform_count = shader_caps.ps_uniform_count;
+ d3d_info->limits.varying_count = shader_caps.varying_count;
+ d3d_info->shader_double_precision = shader_caps.wined3d_caps & WINED3D_SHADER_CAP_DOUBLE_PRECISION;
adapter->vertex_pipe->vp_get_caps(gl_info, &vertex_caps);
- adapter->d3d_info.xyzrhw = vertex_caps.xyzrhw;
- adapter->d3d_info.ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
- adapter->d3d_info.limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
- adapter->d3d_info.limits.active_light_count = vertex_caps.max_active_lights;
- adapter->d3d_info.emulated_flatshading = vertex_caps.emulated_flatshading;
+ d3d_info->xyzrhw = vertex_caps.xyzrhw;
+ d3d_info->ffp_generic_attributes = vertex_caps.ffp_generic_attributes;
+ d3d_info->limits.ffp_vertex_blend_matrices = vertex_caps.max_vertex_blend_matrices;
+ d3d_info->limits.active_light_count = vertex_caps.max_active_lights;
+ d3d_info->emulated_flatshading = vertex_caps.emulated_flatshading;
adapter->fragment_pipe->get_caps(gl_info, &fragment_caps);
- adapter->d3d_info.limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
- adapter->d3d_info.limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
- adapter->d3d_info.shader_color_key = fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY;
- adapter->d3d_info.wined3d_creation_flags = wined3d_creation_flags;
- TRACE("Max texture stages: %u.\n", adapter->d3d_info.limits.ffp_blend_stages);
+ d3d_info->limits.ffp_blend_stages = fragment_caps.MaxTextureBlendStages;
+ d3d_info->limits.ffp_textures = fragment_caps.MaxSimultaneousTextures;
+ d3d_info->shader_color_key = fragment_caps.wined3d_caps & WINED3D_FRAGMENT_CAP_COLOR_KEY;
+ d3d_info->wined3d_creation_flags = wined3d_creation_flags;
+ d3d_info->feature_level = feature_level_from_caps(&shader_caps, &fragment_caps);
+
+ TRACE("Max texture stages: %u.\n", d3d_info->limits.ffp_blend_stages);
- adapter->d3d_info.valid_rt_mask = 0;
+ d3d_info->valid_rt_mask = 0;
for (i = 0; i < gl_info->limits.buffers; ++i)
- adapter->d3d_info.valid_rt_mask |= (1u << i);
+ d3d_info->valid_rt_mask |= (1u << i);
- if (!adapter->d3d_info.shader_color_key)
+ if (!d3d_info->shader_color_key)
{
/* We do not want to deal with re-creating immutable texture storage for color keying emulation. */
WARN("Disabling ARB_texture_storage because fragment pipe doesn't support color keying.\n");
@@ -4431,7 +4420,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
vendor = wined3d_guess_card_vendor(gl_vendor_str, gl_renderer_str);
TRACE("Guessed vendor PCI ID 0x%04x.\n", vendor);
- device = wined3d_guess_card(&shader_caps, &fragment_caps, gl_info->glsl_version,
+ device = wined3d_guess_card(d3d_info->feature_level, gl_info->glsl_version,
gl_renderer_str, &gl_vendor, &vendor);
TRACE("Guessed device PCI ID 0x%04x.\n", device);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d190f7ccfd68..01888469e7a8 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -184,6 +184,19 @@ struct wined3d_ffp_attrib_ops
wined3d_generic_attrib_func generic[WINED3D_FFP_EMIT_COUNT];
};
+enum wined3d_feature_level
+{
+ WINED3D_FEATURE_LEVEL_5,
+ WINED3D_FEATURE_LEVEL_6,
+ WINED3D_FEATURE_LEVEL_7,
+ WINED3D_FEATURE_LEVEL_8,
+ WINED3D_FEATURE_LEVEL_9_SM2,
+ WINED3D_FEATURE_LEVEL_9_SM3,
+ WINED3D_FEATURE_LEVEL_10,
+ WINED3D_FEATURE_LEVEL_11,
+ WINED3D_FEATURE_LEVEL_COUNT
+};
+
struct wined3d_d3d_info
{
struct wined3d_d3d_limits limits;
@@ -196,6 +209,7 @@ struct wined3d_d3d_info
DWORD valid_rt_mask;
DWORD wined3d_creation_flags;
BOOL shader_double_precision;
+ enum wined3d_feature_level feature_level;
};
static const struct color_fixup_desc COLOR_FIXUP_IDENTITY =
--
2.16.4
June 13, 2018