ReactOS 0.4.17-dev-923-g4c9a150
vkd3d_main.c
Go to the documentation of this file.
1/*
2 * Copyright 2016-2017 Józef Kucia for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include "vkd3d_private.h"
20
21VKD3D_DEBUG_ENV_NAME("VKD3D_DEBUG");
22
24 REFIID iid, void **device)
25{
27 struct d3d12_device *object;
28 HRESULT hr;
29
30 TRACE("create_info %p, iid %s, device %p.\n", create_info, debugstr_guid(iid), device);
31
32 if (!create_info)
33 return E_INVALIDARG;
35 {
36 WARN("Invalid structure type %#x.\n", create_info->type);
37 return E_INVALIDARG;
38 }
39 if (!create_info->instance && !create_info->instance_create_info)
40 {
41 WARN("Instance or instance create info is required.\n");
42 return E_INVALIDARG;
43 }
44 if (create_info->instance && create_info->instance_create_info)
45 {
46 WARN("Instance and instance create info are mutually exclusive parameters.\n");
47 return E_INVALIDARG;
48 }
49
52 {
53 WARN("Invalid feature level %#x.\n", create_info->minimum_feature_level);
54 return E_INVALIDARG;
55 }
56
57 if ((instance = create_info->instance))
58 {
60 }
62 {
63 WARN("Failed to create instance, hr %s.\n", debugstr_hresult(hr));
64 return E_FAIL;
65 }
66
67 hr = d3d12_device_create(instance, create_info, &object);
69 if (FAILED(hr))
70 return hr;
71
72 if (!device)
73 {
74 ID3D12Device9_Release(&object->ID3D12Device9_iface);
75 return S_FALSE;
76 }
77
78 return return_interface(&object->ID3D12Device9_iface, &IID_ID3D12Device, iid, device);
79}
80
81/* ID3D12RootSignatureDeserializer */
83{
85 unsigned int refcount;
86
87 union
88 {
92};
93
95
98{
100}
101
103 ID3D12RootSignatureDeserializer *iface, REFIID riid, void **object)
104{
105 TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), object);
106
107 /* QueryInterface() implementation is broken, E_NOINTERFACE is returned for
108 * IUnknown.
109 */
110 if (IsEqualGUID(riid, &IID_ID3D12RootSignatureDeserializer))
111 {
112 ID3D12RootSignatureDeserializer_AddRef(iface);
113 *object = iface;
114 return S_OK;
115 }
116
117 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid));
118
119 *object = NULL;
120 return E_NOINTERFACE;
121}
122
124{
126 unsigned int refcount = vkd3d_atomic_increment_u32(&deserializer->refcount);
127
128 TRACE("%p increasing refcount to %u.\n", deserializer, refcount);
129
130 return refcount;
131}
132
134{
136 unsigned int refcount = vkd3d_atomic_decrement_u32(&deserializer->refcount);
137
138 TRACE("%p decreasing refcount to %u.\n", deserializer, refcount);
139
140 if (!refcount)
141 {
143 vkd3d_free(deserializer);
144 }
145
146 return refcount;
147}
148
151{
153
154 TRACE("iface %p.\n", iface);
155
157 return &deserializer->desc.d3d12.u.Desc_1_0;
158}
159
160static const struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signature_deserializer_vtbl =
161{
162 /* IUnknown methods */
166 /* ID3D12RootSignatureDeserializer methods */
168};
169
172{
174 int ret;
175
176 if ((ret = vkd3d_shader_parse_root_signature(dxbc, &desc, NULL)) < 0)
177 {
178 WARN("Failed to parse root signature, vkd3d result %d.\n", ret);
179 return ret;
180 }
181
183 {
184 *out_desc = desc;
185 }
186 else
187 {
189
192 if (ret < 0)
193 {
194 WARN("Failed to convert from version %#x, vkd3d result %d.\n", version, ret);
195 return ret;
196 }
197
198 *out_desc = converted_desc;
199 }
200
201 return ret;
202}
203
205 const struct vkd3d_shader_code *dxbc)
206{
207 int ret;
208
210 deserializer->refcount = 1;
211
212 if ((ret = vkd3d_parse_root_signature_v_1_0(dxbc, &deserializer->desc.vkd3d)) < 0)
214
215 return S_OK;
216}
217
219 REFIID iid, void **deserializer)
220{
221 struct vkd3d_shader_code dxbc = {data, data_size};
223 HRESULT hr;
224
225 TRACE("data %p, data_size %"PRIuPTR", iid %s, deserializer %p.\n",
226 data, (uintptr_t)data_size, debugstr_guid(iid), deserializer);
227
228 if (!(object = vkd3d_malloc(sizeof(*object))))
229 return E_OUTOFMEMORY;
230
232 {
233 vkd3d_free(object);
234 return hr;
235 }
236
237 return return_interface(&object->ID3D12RootSignatureDeserializer_iface,
238 &IID_ID3D12RootSignatureDeserializer, iid, deserializer);
239}
240
241/* ID3D12VersionedRootSignatureDeserializer */
243{
245 unsigned int refcount;
246
247 union
248 {
252};
253
255
258{
261}
262
264 ID3D12VersionedRootSignatureDeserializer *iface, REFIID iid, void **object)
265{
266 TRACE("iface %p, iid %s, object %p.\n", iface, debugstr_guid(iid), object);
267
268 /* QueryInterface() implementation is broken, E_NOINTERFACE is returned for
269 * IUnknown.
270 */
271 if (IsEqualGUID(iid, &IID_ID3D12VersionedRootSignatureDeserializer))
272 {
273 ID3D12VersionedRootSignatureDeserializer_AddRef(iface);
274 *object = iface;
275 return S_OK;
276 }
277
278 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(iid));
279
280 *object = NULL;
281 return E_NOINTERFACE;
282}
283
285{
287 unsigned int refcount = vkd3d_atomic_increment_u32(&deserializer->refcount);
288
289 TRACE("%p increasing refcount to %u.\n", deserializer, refcount);
290
291 return refcount;
292}
293
295{
297 unsigned int refcount = vkd3d_atomic_decrement_u32(&deserializer->refcount);
298
299 TRACE("%p decreasing refcount to %u.\n", deserializer, refcount);
300
301 if (!refcount)
302 {
305 vkd3d_free(deserializer);
306 }
307
308 return refcount;
309}
310
313{
314 switch (version)
315 {
320 default:
321 WARN("Unknown root signature version %#x.\n", version);
322 return 0;
323 }
324}
325
329{
331 int ret;
332
333 TRACE("iface %p, version %#x, desc %p.\n", iface, version, desc);
334
336 {
337 WARN("Root signature version %#x not supported.\n", version);
338 return E_INVALIDARG;
339 }
340
341 if (deserializer->desc.d3d12.Version == version)
342 {
343 *desc = &deserializer->desc.d3d12;
344 return S_OK;
345 }
346
347 if (!deserializer->other_desc.d3d12.Version)
348 {
351 {
352 WARN("Failed to convert versioned root signature, vkd3d result %d.\n", ret);
354 }
355 }
356
357 VKD3D_ASSERT(deserializer->other_desc.d3d12.Version == version);
358 *desc = &deserializer->other_desc.d3d12;
359 return S_OK;
360}
361
364{
366
367 TRACE("iface %p.\n", iface);
368
369 return &deserializer->desc.d3d12;
370}
371
372static const struct ID3D12VersionedRootSignatureDeserializerVtbl d3d12_versioned_root_signature_deserializer_vtbl =
373{
374 /* IUnknown methods */
378 /* ID3D12VersionedRootSignatureDeserializer methods */
381};
382
384 const struct vkd3d_shader_code *dxbc)
385{
386 int ret;
387
389 deserializer->refcount = 1;
390
391 if ((ret = vkd3d_shader_parse_root_signature(dxbc, &deserializer->desc.vkd3d, NULL)) < 0)
392 {
393 WARN("Failed to parse root signature, vkd3d result %d.\n", ret);
395 }
396
397 memset(&deserializer->other_desc, 0, sizeof(deserializer->other_desc));
398
399 return S_OK;
400}
401
403 REFIID iid, void **deserializer)
404{
406 struct vkd3d_shader_code dxbc = {data, data_size};
407 HRESULT hr;
408
409 TRACE("data %p, data_size %"PRIuPTR", iid %s, deserializer %p.\n",
410 data, (uintptr_t)data_size, debugstr_guid(iid), deserializer);
411
412 if (!(object = vkd3d_malloc(sizeof(*object))))
413 return E_OUTOFMEMORY;
414
416 {
417 vkd3d_free(object);
418 *deserializer = NULL;
419 return hr;
420 }
421
422 return return_interface(&object->ID3D12VersionedRootSignatureDeserializer_iface,
423 &IID_ID3D12VersionedRootSignatureDeserializer, iid, deserializer);
424}
425
428{
430 struct vkd3d_shader_code dxbc;
431 char *messages;
432 HRESULT hr;
433 int ret;
434
435 TRACE("desc %p, version %#x, blob %p, error_blob %p.\n", desc, version, blob, error_blob);
436
438 {
439 WARN("Unexpected Root signature version %#x.\n", version);
440 return E_INVALIDARG;
441 }
442
443 if (!blob)
444 {
445 WARN("Invalid blob parameter.\n");
446 return E_INVALIDARG;
447 }
448
449 if (error_blob)
450 *error_blob = NULL;
451
453 vkd3d_desc.u.v_1_0 = *(const struct vkd3d_shader_root_signature_desc *)desc;
454 if ((ret = vkd3d_shader_serialize_root_signature(&vkd3d_desc, &dxbc, &messages)) < 0)
455 {
456 WARN("Failed to serialize root signature, vkd3d result %d.\n", ret);
457 if (!error_blob)
459 else if (messages && FAILED(hr = vkd3d_blob_create(messages, strlen(messages), error_blob)))
460 ERR("Failed to create error blob, hr %s.\n", debugstr_hresult(hr));
462 }
464
465 if (FAILED(hr = vkd3d_blob_create((void *)dxbc.code, dxbc.size, blob)))
466 {
467 WARN("Failed to create blob object, hr %s.\n", debugstr_hresult(hr));
469 }
470 return hr;
471}
472
474 ID3DBlob **blob, ID3DBlob **error_blob)
475{
476 const struct vkd3d_shader_versioned_root_signature_desc *vkd3d_desc;
477 struct vkd3d_shader_code dxbc;
478 char *messages;
479 HRESULT hr;
480 int ret;
481
482 TRACE("desc %p, blob %p, error_blob %p.\n", desc, blob, error_blob);
483
484 if (!blob)
485 {
486 WARN("Invalid blob parameter.\n");
487 return E_INVALIDARG;
488 }
489
490 if (error_blob)
491 *error_blob = NULL;
492
493 vkd3d_desc = (const struct vkd3d_shader_versioned_root_signature_desc *)desc;
494 if ((ret = vkd3d_shader_serialize_root_signature(vkd3d_desc, &dxbc, &messages)) < 0)
495 {
496 WARN("Failed to serialize root signature, vkd3d result %d.\n", ret);
497 if (!error_blob)
499 else if (messages && FAILED(hr = vkd3d_blob_create(messages, strlen(messages), error_blob)))
500 ERR("Failed to create error blob, hr %s.\n", debugstr_hresult(hr));
502 }
504
505 if (FAILED(hr = vkd3d_blob_create((void *)dxbc.code, dxbc.size, blob)))
506 {
507 WARN("Failed to create blob object, hr %s.\n", debugstr_hresult(hr));
509 }
510 return hr;
511}
512
514{
517}
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
D3D_ROOT_SIGNATURE_VERSION
Definition: d3d12.idl:1403
@ D3D_ROOT_SIGNATURE_VERSION_1_0
Definition: d3d12.idl:1405
@ D3D_ROOT_SIGNATURE_VERSION_1_1
Definition: d3d12.idl:1406
@ D3D_FEATURE_LEVEL_11_0
Definition: d3dcommon.idl:109
static HRESULT hresult_from_vkd3d_result(int vkd3d_result)
Definition: compiler.c:30
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
static HINSTANCE instance
Definition: main.c:35
static const WCHAR version[]
Definition: asmname.c:66
unsigned int uintptr_t
Definition: corecrt.h:185
#define PRIuPTR
Definition: inttypes.h:226
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static IPrintDialogCallback callback
Definition: printdlg.c:325
D3D11_SHADER_VARIABLE_DESC desc
Definition: reflection.c:1683
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define memset(x, y, z)
Definition: compat.h:39
HRESULT d3d12_device_create(struct vkd3d_instance *instance, const struct vkd3d_device_create_info *create_info, struct d3d12_device **device)
Definition: device.c:5534
HRESULT return_interface(void *iface, REFIID iface_iid, REFIID requested_iid, void **object)
Definition: utils.c:628
bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level)
Definition: utils.c:548
#define TRACE(s)
Definition: solgame.cpp:4
D3D12_ROOT_SIGNATURE_DESC Desc_1_0
Definition: d3d12.idl:1414
D3D_ROOT_SIGNATURE_VERSION Version
Definition: d3d12.idl:1411
Definition: image.c:229
struct vkd3d_shader_versioned_root_signature_desc vkd3d
Definition: vkd3d_main.c:90
D3D12_VERSIONED_ROOT_SIGNATURE_DESC d3d12
Definition: vkd3d_main.c:89
ID3D12RootSignatureDeserializer ID3D12RootSignatureDeserializer_iface
Definition: vkd3d_main.c:84
union d3d12_root_signature_deserializer::@6021 desc
struct vkd3d_shader_versioned_root_signature_desc vkd3d
Definition: vkd3d_main.c:250
union d3d12_versioned_root_signature_deserializer::@6022 other_desc
union d3d12_versioned_root_signature_deserializer::@6022 desc
D3D12_VERSIONED_ROOT_SIGNATURE_DESC d3d12
Definition: vkd3d_main.c:249
ID3D12VersionedRootSignatureDeserializer ID3D12VersionedRootSignatureDeserializer_iface
Definition: vkd3d_main.c:244
Definition: devices.h:37
struct vkd3d_instance * instance
Definition: vkd3d.h:261
const struct vkd3d_instance_create_info * instance_create_info
Definition: vkd3d.h:266
D3D_FEATURE_LEVEL minimum_feature_level
Definition: vkd3d.h:255
enum vkd3d_structure_type type
Definition: vkd3d.h:249
const void * code
Definition: vkd3d_shader.h:413
struct vkd3d_shader_root_signature_desc v_1_0
enum vkd3d_shader_root_signature_version version
union vkd3d_shader_versioned_root_signature_desc::@5989 u
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
VKD3D_API HRESULT vkd3d_create_instance(const struct vkd3d_instance_create_info *create_info, struct vkd3d_instance **instance)
Definition: device.c:734
VKD3D_API ULONG vkd3d_instance_decref(struct vkd3d_instance *instance)
Definition: device.c:791
@ VKD3D_STRUCTURE_TYPE_DEVICE_CREATE_INFO
Definition: vkd3d.h:55
VKD3D_API ULONG vkd3d_instance_incref(struct vkd3d_instance *instance)
Definition: device.c:782
HRESULT vkd3d_blob_create(void *buffer, SIZE_T size, ID3D10Blob **blob)
Definition: blob.c:126
static const char * debugstr_hresult(HRESULT hr)
Definition: vkd3d_common.h:244
#define VKD3D_DEBUG_ENV_NAME(name)
Definition: vkd3d_common.h:231
void void vkd3d_dbg_set_log_callback(PFN_vkd3d_log callback)
Definition: debug.c:119
static uint32_t vkd3d_atomic_decrement_u32(uint32_t volatile *x)
Definition: vkd3d_common.h:477
#define VKD3D_ASSERT(cond)
Definition: vkd3d_common.h:49
static uint32_t vkd3d_atomic_increment_u32(uint32_t volatile *x)
Definition: vkd3d_common.h:482
#define STATIC_ASSERT(e)
Definition: vkd3d_common.h:47
static const D3D12_ROOT_SIGNATURE_DESC *STDMETHODCALLTYPE d3d12_root_signature_deserializer_GetRootSignatureDesc(ID3D12RootSignatureDeserializer *iface)
Definition: vkd3d_main.c:149
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_versioned_root_signature_desc *out_desc)
Definition: vkd3d_main.c:170
HRESULT vkd3d_create_device(const struct vkd3d_device_create_info *create_info, REFIID iid, void **device)
Definition: vkd3d_main.c:23
static const struct ID3D12RootSignatureDeserializerVtbl d3d12_root_signature_deserializer_vtbl
Definition: vkd3d_main.c:160
static ULONG STDMETHODCALLTYPE d3d12_root_signature_deserializer_AddRef(ID3D12RootSignatureDeserializer *iface)
Definition: vkd3d_main.c:123
static struct d3d12_root_signature_deserializer * impl_from_ID3D12RootSignatureDeserializer(ID3D12RootSignatureDeserializer *iface)
Definition: vkd3d_main.c:96
void vkd3d_set_log_callback(PFN_vkd3d_log callback)
Definition: vkd3d_main.c:513
static ULONG STDMETHODCALLTYPE d3d12_versioned_root_signature_deserializer_AddRef(ID3D12VersionedRootSignatureDeserializer *iface)
Definition: vkd3d_main.c:284
HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZE_T data_size, REFIID iid, void **deserializer)
Definition: vkd3d_main.c:402
static HRESULT STDMETHODCALLTYPE d3d12_versioned_root_signature_deserializer_GetRootSignatureDescAtVersion(ID3D12VersionedRootSignatureDeserializer *iface, D3D_ROOT_SIGNATURE_VERSION version, const D3D12_VERSIONED_ROOT_SIGNATURE_DESC **desc)
Definition: vkd3d_main.c:326
HRESULT vkd3d_serialize_versioned_root_signature(const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *desc, ID3DBlob **blob, ID3DBlob **error_blob)
Definition: vkd3d_main.c:473
static enum vkd3d_shader_root_signature_version vkd3d_root_signature_version_from_d3d12(D3D_ROOT_SIGNATURE_VERSION version)
Definition: vkd3d_main.c:311
static HRESULT STDMETHODCALLTYPE d3d12_root_signature_deserializer_QueryInterface(ID3D12RootSignatureDeserializer *iface, REFIID riid, void **object)
Definition: vkd3d_main.c:102
static ULONG STDMETHODCALLTYPE d3d12_versioned_root_signature_deserializer_Release(ID3D12VersionedRootSignatureDeserializer *iface)
Definition: vkd3d_main.c:294
static HRESULT d3d12_root_signature_deserializer_init(struct d3d12_root_signature_deserializer *deserializer, const struct vkd3d_shader_code *dxbc)
Definition: vkd3d_main.c:204
static struct d3d12_versioned_root_signature_deserializer * impl_from_ID3D12VersionedRootSignatureDeserializer(ID3D12VersionedRootSignatureDeserializer *iface)
Definition: vkd3d_main.c:256
HRESULT vkd3d_serialize_root_signature(const D3D12_ROOT_SIGNATURE_DESC *desc, D3D_ROOT_SIGNATURE_VERSION version, ID3DBlob **blob, ID3DBlob **error_blob)
Definition: vkd3d_main.c:426
HRESULT vkd3d_create_root_signature_deserializer(const void *data, SIZE_T data_size, REFIID iid, void **deserializer)
Definition: vkd3d_main.c:218
static HRESULT STDMETHODCALLTYPE d3d12_versioned_root_signature_deserializer_QueryInterface(ID3D12VersionedRootSignatureDeserializer *iface, REFIID iid, void **object)
Definition: vkd3d_main.c:263
static HRESULT d3d12_versioned_root_signature_deserializer_init(struct d3d12_versioned_root_signature_deserializer *deserializer, const struct vkd3d_shader_code *dxbc)
Definition: vkd3d_main.c:383
static const struct ID3D12VersionedRootSignatureDeserializerVtbl d3d12_versioned_root_signature_deserializer_vtbl
Definition: vkd3d_main.c:372
static ULONG STDMETHODCALLTYPE d3d12_root_signature_deserializer_Release(ID3D12RootSignatureDeserializer *iface)
Definition: vkd3d_main.c:133
static const D3D12_VERSIONED_ROOT_SIGNATURE_DESC *STDMETHODCALLTYPE d3d12_versioned_root_signature_deserializer_GetUnconvertedRootSignatureDesc(ID3D12VersionedRootSignatureDeserializer *iface)
Definition: vkd3d_main.c:363
static void vkd3d_free(void *ptr)
Definition: vkd3d_memory.h:52
static void * vkd3d_malloc(size_t size)
Definition: vkd3d_memory.h:28
VKD3D_SHADER_API void vkd3d_shader_free_shader_code(struct vkd3d_shader_code *code)
VKD3D_SHADER_API int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_root_signature_desc *root_signature, struct vkd3d_shader_code *dxbc, char **messages)
Definition: dxbc.c:1447
VKD3D_SHADER_API int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_versioned_root_signature_desc *root_signature, char **messages)
Definition: dxbc.c:1043
VKD3D_SHADER_API void vkd3d_shader_set_log_callback(PFN_vkd3d_log callback)
VKD3D_SHADER_API int vkd3d_shader_convert_root_signature(struct vkd3d_shader_versioned_root_signature_desc *dst, enum vkd3d_shader_root_signature_version version, const struct vkd3d_shader_versioned_root_signature_desc *src)
Definition: dxbc.c:1756
vkd3d_shader_root_signature_version
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1
@ VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
VKD3D_SHADER_API void vkd3d_shader_free_root_signature(struct vkd3d_shader_versioned_root_signature_desc *root_signature)
void(* PFN_vkd3d_log)(const char *format, va_list args)
Definition: vkd3d_types.h:66
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479