diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index 325ce57a5..fe0aa2937 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -216,6 +216,324 @@ namespace wiGraphicsTypes } + + // Converters: + inline VkFormat _ConvertFormat(FORMAT value) + { + // _TYPELESS is converted to _UINT or _FLOAT or _UNORM in that order depending on availability! + // X channel is converted to regular missing channel (eg. FORMAT_B8G8R8X8_UNORM -> VK_FORMAT_B8G8R8A8_UNORM) + switch (value) + { + case FORMAT_UNKNOWN: + return VK_FORMAT_UNDEFINED; + break; + case FORMAT_R32G32B32A32_TYPELESS: + return VK_FORMAT_R32G32B32A32_UINT; + break; + case FORMAT_R32G32B32A32_FLOAT: + return VK_FORMAT_R32G32B32A32_SFLOAT; + break; + case FORMAT_R32G32B32A32_UINT: + return VK_FORMAT_R32G32B32A32_UINT; + break; + case FORMAT_R32G32B32A32_SINT: + return VK_FORMAT_R32G32B32A32_SINT; + break; + case FORMAT_R32G32B32_TYPELESS: + return VK_FORMAT_R32G32B32_UINT; + break; + case FORMAT_R32G32B32_FLOAT: + return VK_FORMAT_R32G32B32_SFLOAT; + break; + case FORMAT_R32G32B32_UINT: + return VK_FORMAT_R32G32B32_UINT; + break; + case FORMAT_R32G32B32_SINT: + return VK_FORMAT_R32G32B32_SINT; + break; + case FORMAT_R16G16B16A16_TYPELESS: + return VK_FORMAT_R16G16B16A16_UINT; + break; + case FORMAT_R16G16B16A16_FLOAT: + return VK_FORMAT_R16G16B16A16_SFLOAT; + break; + case FORMAT_R16G16B16A16_UNORM: + return VK_FORMAT_R16G16B16A16_UNORM; + break; + case FORMAT_R16G16B16A16_UINT: + return VK_FORMAT_R16G16B16A16_UINT; + break; + case FORMAT_R16G16B16A16_SNORM: + return VK_FORMAT_R16G16B16A16_SNORM; + break; + case FORMAT_R16G16B16A16_SINT: + return VK_FORMAT_R16G16B16A16_SINT; + break; + case FORMAT_R32G32_TYPELESS: + return VK_FORMAT_R32G32_UINT; + break; + case FORMAT_R32G32_FLOAT: + return VK_FORMAT_R32G32_SFLOAT; + break; + case FORMAT_R32G32_UINT: + return VK_FORMAT_R32G32_UINT; + break; + case FORMAT_R32G32_SINT: + return VK_FORMAT_R32G32_SINT; + break; + case FORMAT_R32G8X24_TYPELESS: + return VK_FORMAT_R32G32_UINT; // possible mismatch! + break; + case FORMAT_D32_FLOAT_S8X24_UINT: + return VK_FORMAT_D32_SFLOAT_S8_UINT; + break; + case FORMAT_R32_FLOAT_X8X24_TYPELESS: + return VK_FORMAT_R32G32_SFLOAT; // possible mismatch! + break; + case FORMAT_X32_TYPELESS_G8X24_UINT: + return VK_FORMAT_R32G32_UINT; // possible mismatch! + break; + case FORMAT_R10G10B10A2_TYPELESS: + return VK_FORMAT_A2B10G10R10_UINT_PACK32; + break; + case FORMAT_R10G10B10A2_UNORM: + return VK_FORMAT_A2B10G10R10_UNORM_PACK32; + break; + case FORMAT_R10G10B10A2_UINT: + return VK_FORMAT_A2B10G10R10_UINT_PACK32; + break; + case FORMAT_R11G11B10_FLOAT: + return VK_FORMAT_B10G11R11_UFLOAT_PACK32; + break; + case FORMAT_R8G8B8A8_TYPELESS: + return VK_FORMAT_R8G8B8A8_UINT; + break; + case FORMAT_R8G8B8A8_UNORM: + return VK_FORMAT_R8G8B8A8_UNORM; + break; + case FORMAT_R8G8B8A8_UNORM_SRGB: + return VK_FORMAT_R8G8B8A8_SRGB; + break; + case FORMAT_R8G8B8A8_UINT: + return VK_FORMAT_R8G8B8A8_UINT; + break; + case FORMAT_R8G8B8A8_SNORM: + return VK_FORMAT_R8G8B8A8_SNORM; + break; + case FORMAT_R8G8B8A8_SINT: + return VK_FORMAT_R8G8B8A8_SINT; + break; + case FORMAT_R16G16_TYPELESS: + return VK_FORMAT_R16G16_UINT; + break; + case FORMAT_R16G16_FLOAT: + return VK_FORMAT_R16G16_SFLOAT; + break; + case FORMAT_R16G16_UNORM: + return VK_FORMAT_R16G16_UNORM; + break; + case FORMAT_R16G16_UINT: + return VK_FORMAT_R16G16_UINT; + break; + case FORMAT_R16G16_SNORM: + return VK_FORMAT_R16G16_SNORM; + break; + case FORMAT_R16G16_SINT: + return VK_FORMAT_R16G16_SINT; + break; + case FORMAT_R32_TYPELESS: + return VK_FORMAT_R32_UINT; + break; + case FORMAT_D32_FLOAT: + return VK_FORMAT_D32_SFLOAT; + break; + case FORMAT_R32_FLOAT: + return VK_FORMAT_R32_SFLOAT; + break; + case FORMAT_R32_UINT: + return VK_FORMAT_R32_UINT; + break; + case FORMAT_R32_SINT: + return VK_FORMAT_R32_SINT; + break; + case FORMAT_R24G8_TYPELESS: + return VK_FORMAT_R32_UINT; + break; + case FORMAT_D24_UNORM_S8_UINT: + return VK_FORMAT_D24_UNORM_S8_UINT; + break; + case FORMAT_R24_UNORM_X8_TYPELESS: + return VK_FORMAT_D24_UNORM_S8_UINT; + break; + case FORMAT_X24_TYPELESS_G8_UINT: + return VK_FORMAT_D24_UNORM_S8_UINT; + break; + case FORMAT_R8G8_TYPELESS: + return VK_FORMAT_R8G8_UINT; + break; + case FORMAT_R8G8_UNORM: + return VK_FORMAT_R8G8_UNORM; + break; + case FORMAT_R8G8_UINT: + return VK_FORMAT_R8G8_UINT; + break; + case FORMAT_R8G8_SNORM: + return VK_FORMAT_R8G8_SNORM; + break; + case FORMAT_R8G8_SINT: + return VK_FORMAT_R8G8_SINT; + break; + case FORMAT_R16_TYPELESS: + return VK_FORMAT_R16_SFLOAT; + break; + case FORMAT_R16_FLOAT: + return VK_FORMAT_R16_SFLOAT; + break; + case FORMAT_D16_UNORM: + return VK_FORMAT_D16_UNORM; + break; + case FORMAT_R16_UNORM: + return VK_FORMAT_R16_UNORM; + break; + case FORMAT_R16_UINT: + return VK_FORMAT_R16_UINT; + break; + case FORMAT_R16_SNORM: + return VK_FORMAT_R16_SNORM; + break; + case FORMAT_R16_SINT: + return VK_FORMAT_R16_SINT; + break; + case FORMAT_R8_TYPELESS: + return VK_FORMAT_R8_UINT; + break; + case FORMAT_R8_UNORM: + return VK_FORMAT_R8_UNORM; + break; + case FORMAT_R8_UINT: + return VK_FORMAT_R8_UINT; + break; + case FORMAT_R8_SNORM: + return VK_FORMAT_R8_SNORM; + break; + case FORMAT_R8_SINT: + return VK_FORMAT_R8_SINT; + break; + case FORMAT_A8_UNORM: + return VK_FORMAT_R8_UNORM; // mismatch! + break; + case FORMAT_R1_UNORM: + return VK_FORMAT_R8_UNORM; // mismatch! + break; + case FORMAT_R9G9B9E5_SHAREDEXP: + return VK_FORMAT_E5B9G9R9_UFLOAT_PACK32; // maybe ok + break; + case FORMAT_R8G8_B8G8_UNORM: + return VK_FORMAT_R8G8B8A8_UNORM; // mismatch + break; + case FORMAT_G8R8_G8B8_UNORM: + return VK_FORMAT_R8G8B8A8_UNORM; // mismatch + break; + case FORMAT_BC1_TYPELESS: + return VK_FORMAT_BC1_RGBA_UNORM_BLOCK; + break; + case FORMAT_BC1_UNORM: + return VK_FORMAT_BC1_RGBA_UNORM_BLOCK; + break; + case FORMAT_BC1_UNORM_SRGB: + return VK_FORMAT_BC1_RGBA_SRGB_BLOCK; + break; + case FORMAT_BC2_TYPELESS: + return VK_FORMAT_BC2_UNORM_BLOCK; + break; + case FORMAT_BC2_UNORM: + return VK_FORMAT_BC2_UNORM_BLOCK; + break; + case FORMAT_BC2_UNORM_SRGB: + return VK_FORMAT_BC2_SRGB_BLOCK; + break; + case FORMAT_BC3_TYPELESS: + return VK_FORMAT_BC3_UNORM_BLOCK; + break; + case FORMAT_BC3_UNORM: + return VK_FORMAT_BC3_UNORM_BLOCK; + break; + case FORMAT_BC3_UNORM_SRGB: + return VK_FORMAT_BC3_SRGB_BLOCK; + break; + case FORMAT_BC4_TYPELESS: + return VK_FORMAT_BC4_UNORM_BLOCK; + break; + case FORMAT_BC4_UNORM: + return VK_FORMAT_BC4_UNORM_BLOCK; + break; + case FORMAT_BC4_SNORM: + return VK_FORMAT_BC4_SNORM_BLOCK; + break; + case FORMAT_BC5_TYPELESS: + return VK_FORMAT_BC5_UNORM_BLOCK; + break; + case FORMAT_BC5_UNORM: + return VK_FORMAT_BC5_UNORM_BLOCK; + break; + case FORMAT_BC5_SNORM: + return VK_FORMAT_BC5_SNORM_BLOCK; + break; + case FORMAT_B5G6R5_UNORM: + return VK_FORMAT_B5G6R5_UNORM_PACK16; + break; + case FORMAT_B5G5R5A1_UNORM: + return VK_FORMAT_A1R5G5B5_UNORM_PACK16; + break; + case FORMAT_B8G8R8A8_UNORM: + return VK_FORMAT_B8G8R8A8_UNORM; + break; + case FORMAT_B8G8R8X8_UNORM: + return VK_FORMAT_B8G8R8A8_UNORM; + break; + case FORMAT_R10G10B10_XR_BIAS_A2_UNORM: + return VK_FORMAT_B10G11R11_UFLOAT_PACK32; // mismatch + break; + case FORMAT_B8G8R8A8_TYPELESS: + return VK_FORMAT_B8G8R8A8_UINT; + break; + case FORMAT_B8G8R8A8_UNORM_SRGB: + return VK_FORMAT_B8G8R8A8_SRGB; + break; + case FORMAT_B8G8R8X8_TYPELESS: + return VK_FORMAT_B8G8R8A8_UINT; + break; + case FORMAT_B8G8R8X8_UNORM_SRGB: + return VK_FORMAT_B8G8R8A8_SRGB; + break; + case FORMAT_BC6H_TYPELESS: + return VK_FORMAT_BC6H_SFLOAT_BLOCK; + break; + case FORMAT_BC6H_UF16: + return VK_FORMAT_BC6H_UFLOAT_BLOCK; + break; + case FORMAT_BC6H_SF16: + return VK_FORMAT_BC6H_SFLOAT_BLOCK; + break; + case FORMAT_BC7_TYPELESS: + return VK_FORMAT_BC7_UNORM_BLOCK; // maybe mismatch + break; + case FORMAT_BC7_UNORM: + return VK_FORMAT_BC7_UNORM_BLOCK; + break; + case FORMAT_BC7_UNORM_SRGB: + return VK_FORMAT_BC7_SRGB_BLOCK; + break; + case FORMAT_B4G4R4A4_UNORM: + return VK_FORMAT_B4G4R4A4_UNORM_PACK16; + break; + default: + break; + } + return VK_FORMAT_UNDEFINED; + } + + // Engine functions GraphicsDevice_Vulkan::GraphicsDevice_Vulkan(wiWindowRegistration::window_type window, bool fullscreen) : GraphicsDevice() { @@ -624,11 +942,129 @@ namespace wiGraphicsTypes } HRESULT GraphicsDevice_Vulkan::CreateGraphicsPSO(const GraphicsPSODesc* pDesc, GraphicsPSO* pso) { - return E_FAIL; + pso->desc = *pDesc; + + pso->renderPass_Vulkan = new VkRenderPass; + pso->pipeline_Vulkan = new VkPipeline; + + + std::vector attachments; + std::vector colorAttachmentRefs; + + attachments.reserve(pDesc->numRTs); + colorAttachmentRefs.reserve(pDesc->numRTs); + + for (UINT i = 0; i < pDesc->numRTs; ++i) + { + VkAttachmentDescription attachment = {}; + attachment.format = _ConvertFormat(pDesc->RTFormats[i]); + attachment.samples = VK_SAMPLE_COUNT_1_BIT; + attachment.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; + attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachment.finalLayout = VK_IMAGE_LAYOUT_GENERAL; + attachments.push_back(attachment); + + VkAttachmentReference ref = {}; + ref.attachment = i; + ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + colorAttachmentRefs.push_back(ref); + } + + + VkSubpassDescription subpass = {}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.colorAttachmentCount = pDesc->numRTs; + subpass.pColorAttachments = colorAttachmentRefs.data(); + + if (pDesc->DSFormat != FORMAT_UNKNOWN && pDesc->dss != nullptr) + { + const bool depth_read_only = pDesc->dss->GetDesc().DepthWriteMask == DEPTH_WRITE_MASK_ZERO; + const bool stencil_read_only = pDesc->dss->GetDesc().StencilWriteMask == 0; + const bool all_read_only = depth_read_only && stencil_read_only; + + VkAttachmentDescription attachment = {}; + attachment.format = _ConvertFormat(pDesc->DSFormat); + attachment.samples = VK_SAMPLE_COUNT_1_BIT; + attachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; // hmmm... + attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD; // hmmm... + attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachment.finalLayout = VK_IMAGE_LAYOUT_GENERAL; + attachments.push_back(attachment); + + VkAttachmentReference depthAttachmentRef = {}; + depthAttachmentRef.attachment = static_cast(attachments.size() - 1); + depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + //if (all_read_only) + //{ + // depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; + //} + //else + //{ + // if (depth_read_only) + // { + // depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR; + // } + // else if (stencil_read_only) + // { + // depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR; + // } + // else + // { + // depthAttachmentRef.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + // } + //} + + subpass.pDepthStencilAttachment = &depthAttachmentRef; + } + + VkRenderPassCreateInfo renderPassInfo = {}; + renderPassInfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + renderPassInfo.attachmentCount = static_cast(attachments.size()); + renderPassInfo.pAttachments = attachments.data(); + renderPassInfo.subpassCount = 1; + renderPassInfo.pSubpasses = &subpass; + + if (vkCreateRenderPass(device, &renderPassInfo, nullptr, &defaultRenderPass) != VK_SUCCESS) { + throw std::runtime_error("failed to create render pass!"); + } + + + + VkGraphicsPipelineCreateInfo pipelineInfo = {}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + pipelineInfo.layout = defaultPipelineLayout; + pipelineInfo.renderPass = *static_cast(pso->renderPass_Vulkan); + pipelineInfo.subpass = 0; + pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; + + // TODO... + //pipelineInfo.stageCount; + + if (vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, static_cast(pso->pipeline_Vulkan)) != VK_SUCCESS) { + throw std::runtime_error("failed to create graphics pipeline!"); + } + + return S_OK; } HRESULT GraphicsDevice_Vulkan::CreateComputePSO(const ComputePSODesc* pDesc, ComputePSO* pso) { - return E_FAIL; + pso->pipeline_Vulkan = new VkPipeline; + + VkComputePipelineCreateInfo pipelineInfo = {}; + pipelineInfo.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO; + pipelineInfo.layout = defaultPipelineLayout; + pipelineInfo.basePipelineHandle = VK_NULL_HANDLE; + + if (vkCreateComputePipelines(device, VK_NULL_HANDLE, 1, &pipelineInfo, nullptr, static_cast(pso->pipeline_Vulkan)) != VK_SUCCESS) { + throw std::runtime_error("failed to create graphics pipeline!"); + } + + return S_OK; } diff --git a/WickedEngine/wiGraphicsResource.cpp b/WickedEngine/wiGraphicsResource.cpp index 36f5787a8..1d8192ace 100644 --- a/WickedEngine/wiGraphicsResource.cpp +++ b/WickedEngine/wiGraphicsResource.cpp @@ -1,6 +1,7 @@ #include "wiGraphicsResource.h" #include "Include_DX11.h" #include "Include_DX12.h" +#include "Include_Vulkan.h" namespace wiGraphicsTypes { @@ -262,18 +263,24 @@ namespace wiGraphicsTypes GraphicsPSO::GraphicsPSO() { SAFE_INIT(resource_DX12); + SAFE_INIT(pipeline_Vulkan); + SAFE_INIT(renderPass_Vulkan); } GraphicsPSO::~GraphicsPSO() { SAFE_DELETE(resource_DX12); + SAFE_DELETE(pipeline_Vulkan); + SAFE_DELETE(renderPass_Vulkan); } ComputePSO::ComputePSO() { SAFE_INIT(resource_DX12); + SAFE_INIT(pipeline_Vulkan); } ComputePSO::~ComputePSO() { SAFE_DELETE(resource_DX12); + SAFE_DELETE(pipeline_Vulkan); } } diff --git a/WickedEngine/wiGraphicsResource.h b/WickedEngine/wiGraphicsResource.h index b51b66505..f125d651c 100644 --- a/WickedEngine/wiGraphicsResource.h +++ b/WickedEngine/wiGraphicsResource.h @@ -48,6 +48,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11VertexShader* resource_DX11; ShaderByteCode code; @@ -60,6 +61,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11PixelShader* resource_DX11; ShaderByteCode code; @@ -72,6 +74,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11GeometryShader* resource_DX11; ShaderByteCode code; @@ -84,6 +87,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11HullShader* resource_DX11; ShaderByteCode code; @@ -96,6 +100,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11DomainShader* resource_DX11; ShaderByteCode code; @@ -108,6 +113,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11ComputeShader* resource_DX11; ShaderByteCode code; @@ -120,6 +126,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11SamplerState* resource_DX11; D3D12_CPU_DESCRIPTOR_HANDLE* resource_DX12; @@ -136,6 +143,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; protected: ID3D11ShaderResourceView* SRV_DX11; // main resource SRV std::vector additionalSRVs_DX11; // can be used for sub-resources if requested @@ -157,6 +165,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11Buffer* resource_DX11; D3D12_CPU_DESCRIPTOR_HANDLE* CBV_DX12; @@ -173,6 +182,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: size_t byteOffset; uint64_t residentFrame; @@ -188,6 +198,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11InputLayout* resource_DX11; @@ -201,6 +212,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11BlendState* resource_DX11; BlendStateDesc desc; @@ -215,6 +227,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11DepthStencilState* resource_DX11; DepthStencilStateDesc desc; @@ -229,6 +242,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11RasterizerState* resource_DX11; RasterizerStateDesc desc; @@ -252,6 +266,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11RenderTargetView* RTV_DX11; std::vector additionalRTVs_DX11; @@ -283,6 +298,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11Texture1D* texture1D_DX11; @@ -298,6 +314,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11DepthStencilView* DSV_DX11; std::vector additionalDSVs_DX11; @@ -317,6 +334,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D11Texture3D* texture3D_DX11; @@ -335,6 +353,7 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: std::vector resource_DX11; std::vector active; @@ -359,8 +378,11 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D12PipelineState* resource_DX12; + void* renderPass_Vulkan; + void* pipeline_Vulkan; GraphicsPSODesc desc; public: @@ -373,8 +395,10 @@ namespace wiGraphicsTypes { friend class GraphicsDevice_DX11; friend class GraphicsDevice_DX12; + friend class GraphicsDevice_Vulkan; private: ID3D12PipelineState* resource_DX12; + void* pipeline_Vulkan; ComputePSODesc desc; public: