Added initial D3D12 code.

This commit is contained in:
Artem Kharytoniuk 2017-10-11 11:24:55 +03:00
parent 089104f677
commit 22d5bdd053
3 changed files with 60 additions and 2 deletions

View File

@ -797,7 +797,49 @@ static void deinit_vulkan_library() {
VkPipeline create_pipeline(const Vk_Pipeline_Def&);
// Helper function for acquiring the first available hardware adapter that supports Direct3D 12.
// If no such adapter can be found, *ppAdapter will be set to nullptr.
void get_hardware_adapter(IDXGIFactory4* p_factory, IDXGIAdapter1** pp_adapter) {
ComPtr<IDXGIAdapter1> adapter;
*pp_adapter = nullptr;
for (UINT adapter_index = 0; DXGI_ERROR_NOT_FOUND != p_factory->EnumAdapters1(adapter_index, &adapter); ++adapter_index) {
DXGI_ADAPTER_DESC1 desc;
adapter->GetDesc1(&desc);
if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) {
// Don't select the Basic Render Driver adapter.
// If you want a software adapter, pass in "/warp" on the command line.
continue;
}
// Check to see if the adapter supports Direct3D 12, but don't create the
// actual device yet.
if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, _uuidof(ID3D12Device), nullptr))) {
break;
}
}
*pp_adapter = adapter.Detach();
}
void vk_initialize() {
#if defined(_DEBUG)
// Enable the D3D12 debug layer
{
ComPtr<ID3D12Debug> debug_controller;
if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&debug_controller)))) {
debug_controller->EnableDebugLayer();
}
}
#endif
ComPtr<IDXGIFactory4> factory;
DX_CHECK(CreateDXGIFactory1(IID_PPV_ARGS(&factory)));
ComPtr<IDXGIAdapter1> hardware_adapter;
get_hardware_adapter(factory.Get(), &hardware_adapter);
DX_CHECK(D3D12CreateDevice(hardware_adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&vk.dx_device)));
init_vulkan_library();
VkPhysicalDeviceFeatures features;

View File

@ -8,6 +8,13 @@
#define VK_NO_PROTOTYPES
#include "vulkan/vulkan.h"
#include "D3d12.h"
#include "D3d12SDKLayers.h"
#include "DXGI1_4.h"
#include "wrl.h"
using Microsoft::WRL::ComPtr;
const int MAX_SWAPCHAIN_IMAGES = 8;
const int MAX_VK_SAMPLERS = 32;
const int MAX_VK_PIPELINES = 1024;
@ -22,6 +29,12 @@ const int MAX_IMAGE_CHUNKS = 16;
ri.Error(ERR_FATAL, "Vulkan: error code %d returned by %s", result, #function_call); \
}
#define DX_CHECK(function_call) { \
HRESULT hr = function_call; \
if (FAILED(hr)) \
ri.Error(ERR_FATAL, "Direct3D: error returned by %s", #function_call); \
}
enum class Vk_Shader_Type {
single_texture,
multi_texture_mul,
@ -107,6 +120,9 @@ void vk_read_pixels(byte* buffer); // screenshots
// This structure is initialized/deinitialized by vk_initialize/vk_shutdown functions correspondingly.
struct Vk_Instance {
bool active = false;
ComPtr<ID3D12Device> dx_device;
VkInstance instance = VK_NULL_HANDLE;
VkPhysicalDevice physical_device = VK_NULL_HANDLE;
VkSurfaceKHR surface = VK_NULL_HANDLE;

View File

@ -79,7 +79,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>winmm.lib;wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;wsock32.lib;D3d12.lib;DXGI.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
@ -120,7 +120,7 @@
<Culture>0x0409</Culture>
</ResourceCompile>
<Link>
<AdditionalDependencies>winmm.lib;wsock32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>winmm.lib;wsock32.lib;D3d12.lib;DXGI.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SuppressStartupBanner>true</SuppressStartupBanner>
<SubSystem>Windows</SubSystem>
<StackReserveSize>8388608</StackReserveSize>