mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-19 13:18:32 +00:00
a/d3d: Split out some d3d11 stuff from generic
This commit is contained in:
parent
79f86ff0e3
commit
ee26b5f575
|
@ -1,26 +1,22 @@
|
||||||
# Copyright 2019-2022, Collabora, Ltd.
|
# Copyright 2019-2022, Collabora, Ltd.
|
||||||
# SPDX-License-Identifier: BSL-1.0
|
# SPDX-License-Identifier: BSL-1.0
|
||||||
|
|
||||||
|
add_library(aux_d3d STATIC d3d_dxgi_formats.h d3d_helpers.cpp d3d_helpers.hpp)
|
||||||
|
target_link_libraries(aux_d3d PUBLIC aux-includes xrt-interfaces ${DXGI_LIBRARY} WIL::WIL)
|
||||||
|
|
||||||
add_library(
|
# needed for format includes
|
||||||
aux_d3d STATIC
|
target_include_directories(aux_d3d PUBLIC ${Vulkan_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(XRT_HAVE_D3D11)
|
||||||
|
target_sources(
|
||||||
|
aux_d3d
|
||||||
|
PRIVATE
|
||||||
|
d3d_d3d11_bits.h
|
||||||
d3d_d3d11_allocator.cpp
|
d3d_d3d11_allocator.cpp
|
||||||
d3d_d3d11_allocator.h
|
d3d_d3d11_allocator.h
|
||||||
d3d_d3d11_allocator.hpp
|
d3d_d3d11_allocator.hpp
|
||||||
d3d_d3d11_fence.cpp
|
d3d_d3d11_fence.cpp
|
||||||
d3d_d3d11_fence.hpp
|
d3d_d3d11_fence.hpp
|
||||||
d3d_dxgi_formats.h
|
|
||||||
d3d_helpers.cpp
|
|
||||||
d3d_helpers.hpp
|
|
||||||
)
|
)
|
||||||
target_link_libraries(
|
target_link_libraries(aux_d3d PUBLIC ${D3D11_LIBRARY})
|
||||||
aux_d3d
|
endif()
|
||||||
PUBLIC
|
|
||||||
aux-includes
|
|
||||||
xrt-interfaces
|
|
||||||
${DXGI_LIBRARY}
|
|
||||||
${D3D11_LIBRARY}
|
|
||||||
WIL::WIL
|
|
||||||
)
|
|
||||||
# needed for format includes
|
|
||||||
target_include_directories(aux_d3d PUBLIC ${Vulkan_INCLUDE_DIR})
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
// SPDX-License-Identifier: BSL-1.0
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
/*!
|
/*!
|
||||||
* @file
|
* @file
|
||||||
* @brief D3D backed image buffer allocator.
|
* @brief D3D11 backed image buffer allocator.
|
||||||
* @author Ryan Pavlik <ryan.pavlik@collabora.com>
|
* @author Ryan Pavlik <ryan.pavlik@collabora.com>
|
||||||
* @ingroup aux_d3d
|
* @ingroup aux_d3d
|
||||||
*/
|
*/
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
#include "d3d_d3d11_allocator.h"
|
#include "d3d_d3d11_allocator.h"
|
||||||
#include "d3d_d3d11_allocator.hpp"
|
#include "d3d_d3d11_allocator.hpp"
|
||||||
|
|
||||||
|
#include "d3d_d3d11_bits.h"
|
||||||
#include "d3d_dxgi_formats.h"
|
#include "d3d_dxgi_formats.h"
|
||||||
|
|
||||||
#include "util/u_misc.h"
|
#include "util/u_misc.h"
|
||||||
|
@ -90,7 +91,7 @@ try {
|
||||||
xsci.height,
|
xsci.height,
|
||||||
xsci.array_size,
|
xsci.array_size,
|
||||||
xsci.mip_count,
|
xsci.mip_count,
|
||||||
d3d_convert_usage_bits_to_bind_flags(xsci.bits)};
|
d3d_convert_usage_bits_to_d3d11_bind_flags(xsci.bits)};
|
||||||
desc.SampleDesc.Count = xsci.sample_count;
|
desc.SampleDesc.Count = xsci.sample_count;
|
||||||
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
|
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
|
||||||
if (keyed_mutex) {
|
if (keyed_mutex) {
|
||||||
|
|
44
src/xrt/auxiliary/d3d/d3d_d3d11_bits.h
Normal file
44
src/xrt/auxiliary/d3d/d3d_d3d11_bits.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// Copyright 2020-2022, Collabora, Ltd.
|
||||||
|
// SPDX-License-Identifier: BSL-1.0
|
||||||
|
/*!
|
||||||
|
* @file
|
||||||
|
* @brief Usage bits for D3D11.
|
||||||
|
* @author Ryan Pavlik <ryan.pavlik@collabora.com>
|
||||||
|
* @ingroup aux_d3d
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "xrt/xrt_compositor.h"
|
||||||
|
#include "xrt/xrt_windows.h"
|
||||||
|
|
||||||
|
#include "d3d11.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static inline UINT
|
||||||
|
d3d_convert_usage_bits_to_d3d11_bind_flags(enum xrt_swapchain_usage_bits xsub)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
if ((xsub & XRT_SWAPCHAIN_USAGE_COLOR) != 0) {
|
||||||
|
ret |= D3D11_BIND_RENDER_TARGET;
|
||||||
|
}
|
||||||
|
if ((xsub & XRT_SWAPCHAIN_USAGE_DEPTH_STENCIL) != 0) {
|
||||||
|
ret |= D3D11_BIND_DEPTH_STENCIL;
|
||||||
|
}
|
||||||
|
if ((xsub & XRT_SWAPCHAIN_USAGE_UNORDERED_ACCESS) != 0) {
|
||||||
|
ret |= D3D11_BIND_UNORDERED_ACCESS;
|
||||||
|
}
|
||||||
|
if ((xsub & XRT_SWAPCHAIN_USAGE_SAMPLED) != 0) {
|
||||||
|
ret |= D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -96,25 +96,6 @@ d3d_dxgi_format_to_vk(DXGI_FORMAT format)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline UINT
|
|
||||||
d3d_convert_usage_bits_to_bind_flags(enum xrt_swapchain_usage_bits xsub)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
if ((xsub & XRT_SWAPCHAIN_USAGE_COLOR) != 0) {
|
|
||||||
ret |= D3D11_BIND_RENDER_TARGET;
|
|
||||||
}
|
|
||||||
if ((xsub & XRT_SWAPCHAIN_USAGE_DEPTH_STENCIL) != 0) {
|
|
||||||
ret |= D3D11_BIND_DEPTH_STENCIL;
|
|
||||||
}
|
|
||||||
if ((xsub & XRT_SWAPCHAIN_USAGE_UNORDERED_ACCESS) != 0) {
|
|
||||||
ret |= D3D11_BIND_UNORDERED_ACCESS;
|
|
||||||
}
|
|
||||||
if ((xsub & XRT_SWAPCHAIN_USAGE_SAMPLED) != 0) {
|
|
||||||
ret |= D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -99,6 +99,7 @@ getAdapterByLUID(const xrt_luid_t &luid, u_logging_level log_level)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef XRT_HAVE_D3D11
|
||||||
HRESULT
|
HRESULT
|
||||||
tryCreateD3D11Device(const wil::com_ptr<IDXGIAdapter> &adapter,
|
tryCreateD3D11Device(const wil::com_ptr<IDXGIAdapter> &adapter,
|
||||||
D3D_DRIVER_TYPE driver_type,
|
D3D_DRIVER_TYPE driver_type,
|
||||||
|
@ -141,4 +142,6 @@ createD3D11Device(const wil::com_ptr<IDXGIAdapter> &adapter, u_logging_level log
|
||||||
THROW_IF_FAILED(hr);
|
THROW_IF_FAILED(hr);
|
||||||
return {device, context};
|
return {device, context};
|
||||||
}
|
}
|
||||||
|
#endif // XRT_HAVE_D3D11
|
||||||
|
|
||||||
} // namespace xrt::auxiliary::d3d
|
} // namespace xrt::auxiliary::d3d
|
||||||
|
|
|
@ -11,11 +11,16 @@
|
||||||
|
|
||||||
#include "xrt/xrt_defines.h"
|
#include "xrt/xrt_defines.h"
|
||||||
#include "xrt/xrt_compositor.h"
|
#include "xrt/xrt_compositor.h"
|
||||||
|
#include "xrt/xrt_config_have.h"
|
||||||
|
|
||||||
#include "util/u_logging.h"
|
#include "util/u_logging.h"
|
||||||
|
|
||||||
#include <dxgi.h>
|
#include <dxgi.h>
|
||||||
|
|
||||||
|
#ifdef XRT_HAVE_D3D11
|
||||||
#include <d3d11.h>
|
#include <d3d11.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <wil/com.h>
|
#include <wil/com.h>
|
||||||
|
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
@ -50,6 +55,7 @@ getAdapterByIndex(uint16_t index, u_logging_level log_level = U_LOGGING_INFO);
|
||||||
wil::com_ptr<IDXGIAdapter>
|
wil::com_ptr<IDXGIAdapter>
|
||||||
getAdapterByLUID(const xrt_luid_t &luid, u_logging_level log_level = U_LOGGING_INFO);
|
getAdapterByLUID(const xrt_luid_t &luid, u_logging_level log_level = U_LOGGING_INFO);
|
||||||
|
|
||||||
|
#ifdef XRT_HAVE_D3D11
|
||||||
/**
|
/**
|
||||||
* @brief Create a D3D11 Device object
|
* @brief Create a D3D11 Device object
|
||||||
*
|
*
|
||||||
|
@ -62,5 +68,6 @@ getAdapterByLUID(const xrt_luid_t &luid, u_logging_level log_level = U_LOGGING_I
|
||||||
*/
|
*/
|
||||||
std::pair<wil::com_ptr<ID3D11Device>, wil::com_ptr<ID3D11DeviceContext>>
|
std::pair<wil::com_ptr<ID3D11Device>, wil::com_ptr<ID3D11DeviceContext>>
|
||||||
createD3D11Device(const wil::com_ptr<IDXGIAdapter> &adapter = nullptr, u_logging_level log_level = U_LOGGING_INFO);
|
createD3D11Device(const wil::com_ptr<IDXGIAdapter> &adapter = nullptr, u_logging_level log_level = U_LOGGING_INFO);
|
||||||
|
#endif // XRT_HAVE_D3D11
|
||||||
|
|
||||||
} // namespace xrt::auxiliary::d3d
|
} // namespace xrt::auxiliary::d3d
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
#include "xrt/xrt_results.h"
|
#include "xrt/xrt_results.h"
|
||||||
#include "xrt/xrt_vulkan_includes.h"
|
#include "xrt/xrt_vulkan_includes.h"
|
||||||
#include "d3d/d3d_dxgi_formats.h"
|
#include "d3d/d3d_dxgi_formats.h"
|
||||||
#include "d3d/d3d_helpers.hpp"
|
#include "d3d/d3d_d3d11_helpers.hpp"
|
||||||
#include "d3d/d3d_d3d11_allocator.hpp"
|
#include "d3d/d3d_d3d11_allocator.hpp"
|
||||||
#include "d3d/d3d_d3d11_fence.hpp"
|
#include "d3d/d3d_d3d11_fence.hpp"
|
||||||
#include "util/u_misc.h"
|
#include "util/u_misc.h"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
#include "util/u_misc.h"
|
#include "util/u_misc.h"
|
||||||
#include "util/u_debug.h"
|
#include "util/u_debug.h"
|
||||||
#include "d3d/d3d_helpers.hpp"
|
#include "d3d/d3d_dxgi_helpers.hpp"
|
||||||
|
|
||||||
#include "oxr_objects.h"
|
#include "oxr_objects.h"
|
||||||
#include "oxr_logger.h"
|
#include "oxr_logger.h"
|
||||||
|
@ -73,20 +73,13 @@ oxr_d3d_get_requirements(struct oxr_logger *log,
|
||||||
}
|
}
|
||||||
|
|
||||||
XrResult
|
XrResult
|
||||||
oxr_d3d_check_device(struct oxr_logger *log, struct oxr_system *sys, IDXGIDevice *device)
|
oxr_d3d_check_luid(struct oxr_logger *log, struct oxr_system *sys, LUID *adapter_luid)
|
||||||
{
|
{
|
||||||
try {
|
if (adapter_luid->HighPart != sys->suggested_d3d_luid.HighPart ||
|
||||||
wil::com_ptr<IDXGIAdapter> adapter;
|
adapter_luid->LowPart != sys->suggested_d3d_luid.LowPart) {
|
||||||
THROW_IF_FAILED(device->GetAdapter(adapter.put()));
|
|
||||||
DXGI_ADAPTER_DESC desc{};
|
|
||||||
adapter->GetDesc(&desc);
|
|
||||||
if (desc.AdapterLuid.HighPart != sys->suggested_d3d_luid.HighPart ||
|
|
||||||
desc.AdapterLuid.LowPart != sys->suggested_d3d_luid.LowPart) {
|
|
||||||
|
|
||||||
return oxr_error(log, XR_ERROR_GRAPHICS_DEVICE_INVALID,
|
return oxr_error(log, XR_ERROR_GRAPHICS_DEVICE_INVALID,
|
||||||
" supplied device does not match required LUID.");
|
" supplied device does not match required LUID.");
|
||||||
}
|
}
|
||||||
return XR_SUCCESS;
|
return XR_SUCCESS;
|
||||||
}
|
}
|
||||||
DEFAULT_CATCH(" failure checking adapter LUID")
|
|
||||||
}
|
|
||||||
|
|
|
@ -48,7 +48,11 @@ oxr_d3d11_check_device(struct oxr_logger *log, struct oxr_system *sys, ID3D11Dev
|
||||||
try {
|
try {
|
||||||
wil::com_ptr<IDXGIDevice> dxgiDevice;
|
wil::com_ptr<IDXGIDevice> dxgiDevice;
|
||||||
THROW_IF_FAILED(device->QueryInterface(dxgiDevice.put()));
|
THROW_IF_FAILED(device->QueryInterface(dxgiDevice.put()));
|
||||||
return oxr_d3d_check_device(log, sys, dxgiDevice.get());
|
wil::com_ptr<IDXGIAdapter> adapter;
|
||||||
|
THROW_IF_FAILED(dxgiDevice->GetAdapter(adapter.put()));
|
||||||
|
DXGI_ADAPTER_DESC desc{};
|
||||||
|
adapter->GetDesc(&desc);
|
||||||
|
return oxr_d3d_check_luid(log, sys, &desc.AdapterLuid);
|
||||||
}
|
}
|
||||||
DEFAULT_CATCH(" failure checking adapter LUID")
|
DEFAULT_CATCH(" failure checking adapter LUID")
|
||||||
}
|
}
|
||||||
|
|
|
@ -1206,14 +1206,16 @@ oxr_session_populate_egl(struct oxr_logger *log,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(XRT_HAVE_D3D11) || defined(XRT_HAVE_D3D12) || defined(XRT_DOXYGEN)
|
#if defined(XRT_HAVE_D3D11) || defined(XRT_HAVE_D3D12) || defined(XRT_DOXYGEN)
|
||||||
|
/// Common GetRequirements call for D3D11 and D3D12
|
||||||
XrResult
|
XrResult
|
||||||
oxr_d3d_get_requirements(struct oxr_logger *log,
|
oxr_d3d_get_requirements(struct oxr_logger *log,
|
||||||
struct oxr_system *sys,
|
struct oxr_system *sys,
|
||||||
LUID *adapter_luid,
|
LUID *adapter_luid,
|
||||||
D3D_FEATURE_LEVEL *min_feature_level);
|
D3D_FEATURE_LEVEL *min_feature_level);
|
||||||
|
|
||||||
|
/// Verify the provided LUID matches the expected one in @p sys
|
||||||
XrResult
|
XrResult
|
||||||
oxr_d3d_check_device(struct oxr_logger *log, struct oxr_system *sys, IDXGIDevice *device);
|
oxr_d3d_check_luid(struct oxr_logger *log, struct oxr_system *sys, LUID *adapter_luid);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue