diff --git a/Documentation/ScriptingAPI-Documentation.md b/Documentation/ScriptingAPI-Documentation.md index 025701546..f74f1848b 100644 --- a/Documentation/ScriptingAPI-Documentation.md +++ b/Documentation/ScriptingAPI-Documentation.md @@ -281,8 +281,6 @@ Loads and plays an audio files. - [outer]audio : Audio -- the audio device - CreateSound(string filename, Sound sound) : bool -- Creates a sound file, returns true if successful, false otherwise - CreateSoundInstance(Sound sound, SoundInstance soundinstance) : bool -- Creates a sound instance that can be replayed, returns true if successful, false otherwise -- Destroy(Sound sound) -- Destroy(SoundInsance soundinstance) - Play(SoundInsance soundinstance) - Pause(SoundInsance soundinstance) - Stop(SoundInsance soundinstance) diff --git a/Documentation/WickedEngine-Documentation.md b/Documentation/WickedEngine-Documentation.md index 2f6699942..bec8f5b28 100644 --- a/Documentation/WickedEngine-Documentation.md +++ b/Documentation/WickedEngine-Documentation.md @@ -395,6 +395,7 @@ Returns true if the current window is the topmost one, false if it is not in foc Everything related to rendering graphics will be discussed below ### wiGraphics +[[Header]](../WickedEngine/wiGraphics.h) The graphics API wrappers #### GraphicsDevice @@ -408,7 +409,7 @@ When creating a graphics device, it can be created in special debug mode to assi Functions like `CreateTexture()`, `CreateBuffer()`, etc. can be used to create corresponding GPU resources. Using these functions is thread safe. The resources will not necessarily be created immediately, but by the time the GPU will want to use them. These functions imediately return `false` if there were any errors, such as wrong parameters being passed to the description parameters, and they will return `true` if everything is correct. If there was an error, please use the [debug device](#debug-device) functionality to get additional information. When passing a resource to these functions that is already created, it will be destroyed, then created again with the newly provided parameters. ##### Destroying resources -You can use the functions such as `DestroyTexture()` or `DestroyBuffer()`, etc. to destroy resources that are no longer needed. These are not necessary to be called, as GPU resources will also call this when their destructor is called. Destroying the resource might be delayed until the time the GPU is finished with them, but the user can immediately reuse the resource and doesn't need to care about this. +Resources will be destroyed automatically by the graphics device when they are no longer used. ##### Work submission Rendering commands that expect a `CommandList` as a parameter are not executed immediately. They will be recorded into command lists and submitted to the GPU for execution upon calling the `PresentEnd()` function. The `CommandList` is a simple handle that associates rendering commands to a CPU execution timeline. The `CommandList` is not thread safe, so every `CommandList` can be used by a single CPU thread at a time to record commands. In a multithreading scenario, each CPU thread should have its own `CommandList`. `CommandList`s can be retrieved from the [GraphicsDevice](#graphicsdevice) by calling `GraphicsDevice::BeginCommandList()` that will return a `CommandList` handle that is free to be used from that point by the calling thread. All such handles will be in use until `PresentEnd()` was called, where GPU submission takes place. The command lists will be submitted in the order they were retrieved with `GraphicsDevice::BeginCommandList()`. The order of submission correlates with the order of actual GPU execution. For example: @@ -998,7 +999,6 @@ Handles audio playback and spatial audio. The namespace that is a collection of audio related functionality. It is currently implemented with XAudio2 - CreateSound - CreateSoundInstance -- Destroy - Play - Pause - Stop @@ -1104,7 +1104,6 @@ Bullet physics engine implementation of the physics update system Simple interface that provides UDP networking features. - Initialize - CreateSocket -- Destroy - Send - ListenPort - CanReceive diff --git a/Editor/Translator.cpp b/Editor/Translator.cpp index 97a68d43f..cb846228f 100644 --- a/Editor/Translator.cpp +++ b/Editor/Translator.cpp @@ -27,7 +27,7 @@ void Translator::LoadShaders() desc.vs = wiRenderer::GetVertexShader(VSTYPE_VERTEXCOLOR); desc.ps = wiRenderer::GetPixelShader(PSTYPE_VERTEXCOLOR); - desc.il = wiRenderer::GetVertexLayout(VLTYPE_VERTEXCOLOR); + desc.il = wiRenderer::GetInputLayout(ILTYPE_VERTEXCOLOR); desc.dss = wiRenderer::GetDepthStencilState(DSSTYPE_XRAY); desc.rs = wiRenderer::GetRasterizerState(RSTYPE_DOUBLESIDED); desc.bs = wiRenderer::GetBlendState(BSTYPE_ADDITIVE); @@ -41,7 +41,7 @@ void Translator::LoadShaders() desc.vs = wiRenderer::GetVertexShader(VSTYPE_VERTEXCOLOR); desc.ps = wiRenderer::GetPixelShader(PSTYPE_VERTEXCOLOR); - desc.il = wiRenderer::GetVertexLayout(VLTYPE_VERTEXCOLOR); + desc.il = wiRenderer::GetInputLayout(ILTYPE_VERTEXCOLOR); desc.dss = wiRenderer::GetDepthStencilState(DSSTYPE_XRAY); desc.rs = wiRenderer::GetRasterizerState(RSTYPE_WIRE_DOUBLESIDED_SMOOTH); desc.bs = wiRenderer::GetBlendState(BSTYPE_TRANSPARENT); diff --git a/WickedEngine/WickedEngine_SOURCE.vcxitems b/WickedEngine/WickedEngine_SOURCE.vcxitems index 11ade355c..63bffe134 100644 --- a/WickedEngine/WickedEngine_SOURCE.vcxitems +++ b/WickedEngine/WickedEngine_SOURCE.vcxitems @@ -328,10 +328,9 @@ - + - @@ -656,7 +655,6 @@ - diff --git a/WickedEngine/WickedEngine_SOURCE.vcxitems.filters b/WickedEngine/WickedEngine_SOURCE.vcxitems.filters index dda4cffdb..11a233a0a 100644 --- a/WickedEngine/WickedEngine_SOURCE.vcxitems.filters +++ b/WickedEngine/WickedEngine_SOURCE.vcxitems.filters @@ -921,18 +921,12 @@ ENGINE\Graphics\GPUMapping - - ENGINE\Graphics\API - ENGINE\Graphics\API ENGINE\Graphics\API - - ENGINE\Graphics\API - ENGINE\Graphics\GPUMapping @@ -1128,6 +1122,9 @@ ENGINE\Tools + + ENGINE\Graphics\API + @@ -1760,9 +1757,6 @@ ENGINE\Graphics\API - - ENGINE\Graphics\API - ENGINE\Graphics diff --git a/WickedEngine/wiAudio.cpp b/WickedEngine/wiAudio.cpp index eff4bb12e..71c265b59 100644 --- a/WickedEngine/wiAudio.cpp +++ b/WickedEngine/wiAudio.cpp @@ -3,7 +3,6 @@ #include "wiHelper.h" #include -#include #include #include @@ -157,14 +156,6 @@ namespace wiAudio }; std::shared_ptr audio; - Sound::~Sound() - { - Destroy(this); - } - SoundInstance::~SoundInstance() - { - Destroy(this); - } struct SoundInternal { std::shared_ptr audio; @@ -174,12 +165,18 @@ namespace wiAudio struct SoundInstanceInternal { std::shared_ptr audio; + std::shared_ptr soundinternal; IXAudio2SourceVoice* sourceVoice = nullptr; XAUDIO2_VOICE_DETAILS voiceDetails = {}; std::vector outputMatrix; std::vector channelAzimuths; XAUDIO2_BUFFER buffer = {}; - const SoundInternal* soundinternal = nullptr; + + ~SoundInstanceInternal() + { + sourceVoice->Stop(); + sourceVoice->DestroyVoice(); + } }; void Initialize() @@ -264,7 +261,8 @@ namespace wiAudio bool CreateSound(const std::string& filename, Sound* sound) { - Destroy(sound); + std::shared_ptr soundinternal = std::make_shared(); + sound->internal_state = soundinternal; std::wstring wfilename; wiHelper::StringConvert(filename, wfilename); @@ -299,7 +297,6 @@ namespace wiAudio assert(SUCCEEDED(hr)); assert(filetype == fourccWAVE); - SoundInternal* soundinternal = new SoundInternal; soundinternal->audio = audio; hr = FindChunk(hFile, fourccFMT, dwChunkSize, dwChunkPosition); @@ -315,17 +312,15 @@ namespace wiAudio hr = ReadChunkData(hFile, soundinternal->audioData.data(), dwChunkSize, dwChunkPosition); assert(SUCCEEDED(hr)); - sound->handle = (wiCPUHandle)soundinternal; - return true; } bool CreateSoundInstance(const Sound* sound, SoundInstance* instance) { - Destroy(instance); - HRESULT hr; - const SoundInternal* soundinternal = (const SoundInternal*)sound->handle; - SoundInstanceInternal* instanceinternal = new SoundInstanceInternal; + std::shared_ptr soundinternal = std::static_pointer_cast(sound->internal_state); + std::shared_ptr instanceinternal = std::make_shared(); + instance->internal_state = instanceinternal; + instanceinternal->audio = audio; instanceinternal->soundinternal = soundinternal; @@ -366,53 +361,31 @@ namespace wiAudio return false; } - instance->handle = (wiCPUHandle)instanceinternal; - return true; } - void Destroy(Sound* sound) - { - if (sound != nullptr && sound->handle != WI_NULL_HANDLE) - { - SoundInternal* soundinternal = (SoundInternal*)sound->handle; - delete soundinternal; - sound->handle = WI_NULL_HANDLE; - } - } - void Destroy(SoundInstance* instance) - { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) - { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; - instanceinternal->sourceVoice->Stop(); - instanceinternal->sourceVoice->DestroyVoice(); - delete instanceinternal; - instance->handle = WI_NULL_HANDLE; - } - } void Play(SoundInstance* instance) { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) + if (instance != nullptr && instance->IsValid()) { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); HRESULT hr = instanceinternal->sourceVoice->Start(); assert(SUCCEEDED(hr)); } } void Pause(SoundInstance* instance) { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) + if (instance != nullptr && instance->IsValid()) { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); HRESULT hr = instanceinternal->sourceVoice->Stop(); // preserves cursor position assert(SUCCEEDED(hr)); } } void Stop(SoundInstance* instance) { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) + if (instance != nullptr && instance->IsValid()) { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); HRESULT hr = instanceinternal->sourceVoice->Stop(); // preserves cursor position assert(SUCCEEDED(hr)); hr = instanceinternal->sourceVoice->FlushSourceBuffers(); // reset submitted audio buffer @@ -423,14 +396,14 @@ namespace wiAudio } void SetVolume(float volume, SoundInstance* instance) { - if (instance == nullptr || instance->handle == WI_NULL_HANDLE) + if (instance == nullptr || !instance->IsValid()) { HRESULT hr = audio->masteringVoice->SetVolume(volume); assert(SUCCEEDED(hr)); } else { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); HRESULT hr = instanceinternal->sourceVoice->SetVolume(volume); assert(SUCCEEDED(hr)); } @@ -438,22 +411,22 @@ namespace wiAudio float GetVolume(const SoundInstance* instance) { float volume = 0; - if (instance == nullptr || instance->handle == WI_NULL_HANDLE) + if (instance == nullptr || !instance->IsValid()) { audio->masteringVoice->GetVolume(&volume); } else { - const SoundInstanceInternal* instanceinternal = (const SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); instanceinternal->sourceVoice->GetVolume(&volume); } return volume; } void ExitLoop(SoundInstance* instance) { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) + if (instance != nullptr && instance->IsValid()) { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); HRESULT hr = instanceinternal->sourceVoice->ExitLoop(); assert(SUCCEEDED(hr)); } @@ -473,9 +446,9 @@ namespace wiAudio void Update3D(SoundInstance* instance, const SoundInstance3D& instance3D) { - if (instance != nullptr && instance->handle != WI_NULL_HANDLE) + if (instance != nullptr && instance->IsValid()) { - SoundInstanceInternal* instanceinternal = (SoundInstanceInternal*)instance->handle; + std::shared_ptr instanceinternal = std::static_pointer_cast(instance->internal_state); X3DAUDIO_LISTENER listener = {}; listener.Position = instance3D.listenerPos; diff --git a/WickedEngine/wiAudio.h b/WickedEngine/wiAudio.h index 6f0f0098d..14e421d7d 100644 --- a/WickedEngine/wiAudio.h +++ b/WickedEngine/wiAudio.h @@ -1,6 +1,7 @@ #pragma once #include "CommonInclude.h" +#include #include namespace wiAudio @@ -20,57 +21,21 @@ namespace wiAudio struct Sound { - wiCPUHandle handle = WI_NULL_HANDLE; - - void operator=(Sound&& other) - { - handle = other.handle; - other.handle = WI_NULL_HANDLE; - } - - Sound() {} - Sound(Sound&& other) - { - handle = other.handle; - - other.handle = WI_NULL_HANDLE; - } - ~Sound(); + std::shared_ptr internal_state; + inline bool IsValid() const { return internal_state.get() != nullptr; } }; struct SoundInstance { + std::shared_ptr internal_state; + inline bool IsValid() const { return internal_state.get() != nullptr; } + SUBMIX_TYPE type = SUBMIX_TYPE_SOUNDEFFECT; float loop_begin = 0; // loop region begin in seconds (0 = from beginning) float loop_length = 0; // loop region legth in seconds (0 = until the end) - wiCPUHandle handle = WI_NULL_HANDLE; - - void operator=(SoundInstance&& other) - { - type = other.type; - loop_begin = other.loop_begin; - loop_length = other.loop_length; - handle = other.handle; - - other.handle = WI_NULL_HANDLE; - } - - SoundInstance() {} - SoundInstance(SoundInstance&& other) - { - type = other.type; - loop_begin = other.loop_begin; - loop_length = other.loop_length; - handle = other.handle; - - other.handle = WI_NULL_HANDLE; - } - ~SoundInstance(); }; bool CreateSound(const std::string& filename, Sound* sound); bool CreateSoundInstance(const Sound* sound, SoundInstance* instance); - void Destroy(Sound* sound); - void Destroy(SoundInstance* instance); void Play(SoundInstance* instance); void Pause(SoundInstance* instance); diff --git a/WickedEngine/wiAudio_BindLua.cpp b/WickedEngine/wiAudio_BindLua.cpp index c64165e1c..acab79bb6 100644 --- a/WickedEngine/wiAudio_BindLua.cpp +++ b/WickedEngine/wiAudio_BindLua.cpp @@ -7,7 +7,6 @@ const char wiAudio_BindLua::className[] = "Audio"; Luna::FunctionType wiAudio_BindLua::methods[] = { lunamethod(wiAudio_BindLua, CreateSound), lunamethod(wiAudio_BindLua, CreateSoundInstance), - lunamethod(wiAudio_BindLua, Destroy), lunamethod(wiAudio_BindLua, Play), lunamethod(wiAudio_BindLua, Pause), lunamethod(wiAudio_BindLua, Stop), @@ -66,33 +65,6 @@ int wiAudio_BindLua::CreateSoundInstance(lua_State* L) wiLua::SError(L, "CreateSoundInstance(Sound sound, SoundInstance soundinstance) not enough arguments!"); return 0; } -int wiAudio_BindLua::Destroy(lua_State* L) -{ - int argc = wiLua::SGetArgCount(L); - if (argc > 0) - { - wiSound_BindLua* sound = Luna::lightcheck(L, 1); - if (sound != nullptr) - { - wiAudio::Destroy(sound->sound); - } - else - { - wiSoundInstance_BindLua* soundinstance = Luna::lightcheck(L, 1); - if (soundinstance != nullptr) - { - wiAudio::Destroy(&soundinstance->soundinstance); - } - else - { - wiLua::SError(L, "Destroy(Sound sound); Destroy(SoundInstance soundinstance) argument types mismatch!"); - } - } - } - else - wiLua::SError(L, "Destroy(Sound sound); Destroy(SoundInstance soundinstance) not enough arguments!"); - return 0; -} int wiAudio_BindLua::Play(lua_State* L) { int argc = wiLua::SGetArgCount(L); diff --git a/WickedEngine/wiAudio_BindLua.h b/WickedEngine/wiAudio_BindLua.h index 4566a8b9b..9d34e94c3 100644 --- a/WickedEngine/wiAudio_BindLua.h +++ b/WickedEngine/wiAudio_BindLua.h @@ -15,7 +15,6 @@ public: int CreateSound(lua_State* L); int CreateSoundInstance(lua_State* L); - int Destroy(lua_State* L); int Play(lua_State* L); int Pause(lua_State* L); int Stop(lua_State* L); diff --git a/WickedEngine/wiEnums.h b/WickedEngine/wiEnums.h index 9bd5d4879..8ee4592f5 100644 --- a/WickedEngine/wiEnums.h +++ b/WickedEngine/wiEnums.h @@ -337,19 +337,19 @@ enum CSTYPES CSTYPE_COUNT }; -// vertex layouts -enum VLTYPES +// input layouts +enum ILTYPES { - VLTYPE_OBJECT_DEBUG, - VLTYPE_OBJECT_POS, - VLTYPE_OBJECT_POS_TEX, - VLTYPE_OBJECT_ALL, - VLTYPE_SHADOW_POS, - VLTYPE_SHADOW_POS_TEX, - VLTYPE_RENDERLIGHTMAP, - VLTYPE_VERTEXCOLOR, - VLTYPE_TRAIL, - VLTYPE_COUNT + ILTYPE_OBJECT_DEBUG, + ILTYPE_OBJECT_POS, + ILTYPE_OBJECT_POS_TEX, + ILTYPE_OBJECT_ALL, + ILTYPE_SHADOW_POS, + ILTYPE_SHADOW_POS_TEX, + ILTYPE_RENDERLIGHTMAP, + ILTYPE_VERTEXCOLOR, + ILTYPE_TRAIL, + ILTYPE_COUNT }; // rasterizer states enum RSTYPES diff --git a/WickedEngine/wiFont.cpp b/WickedEngine/wiFont.cpp index 64e89f001..af2ec421d 100644 --- a/WickedEngine/wiFont.cpp +++ b/WickedEngine/wiFont.cpp @@ -37,7 +37,7 @@ namespace wiFont_Internal DepthStencilState depthStencilState; Sampler sampler; - VertexLayout vertexLayout; + InputLayout inputLayout; Shader vertexShader; Shader pixelShader; PipelineState PSO; @@ -282,7 +282,7 @@ void wiFont::Initialize() samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = FLT_MAX; - device->CreateSamplerState(&samplerDesc, &sampler); + device->CreateSampler(&samplerDesc, &sampler); LoadShaders(); @@ -294,13 +294,13 @@ void wiFont::LoadShaders() { std::string path = wiRenderer::GetShaderPath(); - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION", 0, FORMAT_R16G16_SINT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, FORMAT_R16G16_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION", 0, FORMAT_R16G16_SINT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, FORMAT_R16G16_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, }; wiRenderer::LoadShader(VS, vertexShader, "fontVS.cso"); - wiRenderer::GetDevice()->CreateInputLayout(layout, arraysize(layout), &vertexShader.code, &vertexLayout); + wiRenderer::GetDevice()->CreateInputLayout(layout, arraysize(layout), &vertexShader, &inputLayout); wiRenderer::LoadShader(PS, pixelShader, "fontPS.cso"); @@ -309,7 +309,7 @@ void wiFont::LoadShaders() PipelineStateDesc desc; desc.vs = &vertexShader; desc.ps = &pixelShader; - desc.il = &vertexLayout; + desc.il = &inputLayout; desc.bs = &blendState; desc.dss = &depthStencilState; desc.rs = &rasterizerState; diff --git a/WickedEngine/wiGraphicsDescriptors.h b/WickedEngine/wiGraphics.h similarity index 83% rename from WickedEngine/wiGraphicsDescriptors.h rename to WickedEngine/wiGraphics.h index 4d56f75b0..693a77e71 100644 --- a/WickedEngine/wiGraphicsDescriptors.h +++ b/WickedEngine/wiGraphics.h @@ -1,5 +1,7 @@ #pragma once #include "CommonInclude.h" +#include +#include namespace wiGraphics { @@ -7,7 +9,7 @@ namespace wiGraphics struct BlendState; struct RasterizerState; struct DepthStencilState; - struct VertexLayout; + struct InputLayout; struct GPUResource; struct GPUBuffer; struct Texture; @@ -317,7 +319,7 @@ namespace wiGraphics RESOURCE_MISC_TILED = 0x40000L, }; - // Structs ///////////////////////////////////////////// + // Descriptor structs: struct Viewport { @@ -328,7 +330,7 @@ namespace wiGraphics float MinDepth = 0.0f; float MaxDepth = 1.0f; }; - struct VertexLayoutDesc + struct InputLayoutDesc { static const uint32_t APPEND_ALIGNED_ELEMENT = 0xffffffff; // automatically figure out AlignedByteOffset depending on Format @@ -463,7 +465,7 @@ namespace wiGraphics const BlendState* bs = nullptr; const RasterizerState* rs = nullptr; const DepthStencilState* dss = nullptr; - const VertexLayout* il = nullptr; + const InputLayout* il = nullptr; PRIMITIVETOPOLOGY pt = TRIANGLELIST; uint32_t sampleMask = 0xFFFFFFFF; }; @@ -584,4 +586,123 @@ namespace wiGraphics int32_t bottom = 0; }; + + // Resources: + + struct GraphicsDeviceChild + { + std::shared_ptr internal_state; + inline bool IsValid() const { return internal_state.get() != nullptr; } + }; + + struct Shader : public GraphicsDeviceChild + { + SHADERSTAGE stage = SHADERSTAGE_COUNT; + std::vector code; + wiCPUHandle resource = WI_NULL_HANDLE; + }; + + struct Sampler : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + SamplerDesc desc; + + const SamplerDesc& GetDesc() const { return desc; } + }; + + struct GPUResource : public GraphicsDeviceChild + { + enum class GPU_RESOURCE_TYPE + { + BUFFER, + TEXTURE, + UNKNOWN_TYPE, + } type = GPU_RESOURCE_TYPE::UNKNOWN_TYPE; + inline bool IsTexture() const { return type == GPU_RESOURCE_TYPE::TEXTURE; } + inline bool IsBuffer() const { return type == GPU_RESOURCE_TYPE::BUFFER; } + + wiCPUHandle SRV = WI_NULL_HANDLE; + std::vector subresourceSRVs; + + wiCPUHandle UAV = WI_NULL_HANDLE; + std::vector subresourceUAVs; + + wiCPUHandle resource = WI_NULL_HANDLE; + }; + + struct GPUBuffer : public GPUResource + { + wiCPUHandle CBV = WI_NULL_HANDLE; + GPUBufferDesc desc; + + const GPUBufferDesc& GetDesc() const { return desc; } + }; + + struct InputLayout : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + + std::vector desc; + }; + + struct BlendState : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + BlendStateDesc desc; + + const BlendStateDesc& GetDesc() const { return desc; } + }; + + struct DepthStencilState : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + DepthStencilStateDesc desc; + + const DepthStencilStateDesc& GetDesc() const { return desc; } + }; + + struct RasterizerState : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + RasterizerStateDesc desc; + + const RasterizerStateDesc& GetDesc() const { return desc; } + }; + + struct Texture : public GPUResource + { + TextureDesc desc; + wiCPUHandle RTV = WI_NULL_HANDLE; + std::vector subresourceRTVs; + wiCPUHandle DSV = WI_NULL_HANDLE; + std::vector subresourceDSVs; + + const TextureDesc& GetDesc() const { return desc; } + }; + + struct GPUQuery : public GraphicsDeviceChild + { + wiCPUHandle resource = WI_NULL_HANDLE; + GPUQueryDesc desc; + + const GPUQueryDesc& GetDesc() const { return desc; } + }; + + struct PipelineState : public GraphicsDeviceChild + { + size_t hash = 0; + PipelineStateDesc desc; + + const PipelineStateDesc& GetDesc() const { return desc; } + }; + + struct RenderPass : public GraphicsDeviceChild + { + size_t hash = 0; + wiCPUHandle framebuffer = WI_NULL_HANDLE; + wiCPUHandle renderpass = WI_NULL_HANDLE; + RenderPassDesc desc; + + const RenderPassDesc& GetDesc() const { return desc; } + }; } diff --git a/WickedEngine/wiGraphicsDevice.h b/WickedEngine/wiGraphicsDevice.h index 25cdaa3e4..380267c20 100644 --- a/WickedEngine/wiGraphicsDevice.h +++ b/WickedEngine/wiGraphicsDevice.h @@ -1,7 +1,6 @@ #pragma once #include "CommonInclude.h" -#include "wiGraphicsDescriptors.h" -#include "wiGraphicsResource.h" +#include "wiGraphics.h" #include #include @@ -34,12 +33,12 @@ namespace wiGraphics virtual bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) = 0; virtual bool CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) = 0; - virtual bool CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) = 0; + virtual bool CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) = 0; virtual bool CreateShader(SHADERSTAGE stage, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) = 0; virtual bool CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) = 0; virtual bool CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) = 0; virtual bool CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) = 0; - virtual bool CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) = 0; + virtual bool CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) = 0; virtual bool CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) = 0; virtual bool CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) = 0; virtual bool CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) = 0; @@ -49,7 +48,7 @@ namespace wiGraphics virtual void DestroyResource(GPUResource* pResource) = 0; virtual void DestroyBuffer(GPUBuffer *pBuffer) = 0; virtual void DestroyTexture(Texture *pTexture) = 0; - virtual void DestroyInputLayout(VertexLayout *pInputLayout) = 0; + virtual void DestroyInputLayout(InputLayout *pInputLayout) = 0; virtual void DestroyShader(Shader *pShader) = 0; virtual void DestroyBlendState(BlendState *pBlendState) = 0; virtual void DestroyDepthStencilState(DepthStencilState *pDepthStencilState) = 0; diff --git a/WickedEngine/wiGraphicsDevice_DX11.cpp b/WickedEngine/wiGraphicsDevice_DX11.cpp index 58de6774d..10ef0839d 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.cpp +++ b/WickedEngine/wiGraphicsDevice_DX11.cpp @@ -14,1064 +14,1194 @@ using namespace std; namespace wiGraphics { -// Engine -> Native converters -constexpr uint32_t _ParseBindFlags(uint32_t value) +namespace DX11_Internal { - uint32_t _flag = 0; + // Engine -> Native converters - if (value & BIND_VERTEX_BUFFER) - _flag |= D3D11_BIND_VERTEX_BUFFER; - if (value & BIND_INDEX_BUFFER) - _flag |= D3D11_BIND_INDEX_BUFFER; - if (value & BIND_CONSTANT_BUFFER) - _flag |= D3D11_BIND_CONSTANT_BUFFER; - if (value & BIND_SHADER_RESOURCE) - _flag |= D3D11_BIND_SHADER_RESOURCE; - if (value & BIND_STREAM_OUTPUT) - _flag |= D3D11_BIND_STREAM_OUTPUT; - if (value & BIND_RENDER_TARGET) - _flag |= D3D11_BIND_RENDER_TARGET; - if (value & BIND_DEPTH_STENCIL) - _flag |= D3D11_BIND_DEPTH_STENCIL; - if (value & BIND_UNORDERED_ACCESS) - _flag |= D3D11_BIND_UNORDERED_ACCESS; - - return _flag; -} -constexpr uint32_t _ParseCPUAccessFlags(uint32_t value) -{ - uint32_t _flag = 0; - - if (value & CPU_ACCESS_WRITE) - _flag |= D3D11_CPU_ACCESS_WRITE; - if (value & CPU_ACCESS_READ) - _flag |= D3D11_CPU_ACCESS_READ; - - return _flag; -} -constexpr uint32_t _ParseResourceMiscFlags(uint32_t value) -{ - uint32_t _flag = 0; - - if (value & RESOURCE_MISC_SHARED) - _flag |= D3D11_RESOURCE_MISC_SHARED; - if (value & RESOURCE_MISC_TEXTURECUBE) - _flag |= D3D11_RESOURCE_MISC_TEXTURECUBE; - if (value & RESOURCE_MISC_INDIRECT_ARGS) - _flag |= D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS; - if (value & RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) - _flag |= D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; - if (value & RESOURCE_MISC_BUFFER_STRUCTURED) - _flag |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; - if (value & RESOURCE_MISC_TILED) - _flag |= D3D11_RESOURCE_MISC_TILED; - - return _flag; -} -constexpr uint32_t _ParseColorWriteMask(uint32_t value) -{ - uint32_t _flag = 0; - - if (value == D3D11_COLOR_WRITE_ENABLE_ALL) + constexpr uint32_t _ParseBindFlags(uint32_t value) { - return D3D11_COLOR_WRITE_ENABLE_ALL; + uint32_t _flag = 0; + + if (value & BIND_VERTEX_BUFFER) + _flag |= D3D11_BIND_VERTEX_BUFFER; + if (value & BIND_INDEX_BUFFER) + _flag |= D3D11_BIND_INDEX_BUFFER; + if (value & BIND_CONSTANT_BUFFER) + _flag |= D3D11_BIND_CONSTANT_BUFFER; + if (value & BIND_SHADER_RESOURCE) + _flag |= D3D11_BIND_SHADER_RESOURCE; + if (value & BIND_STREAM_OUTPUT) + _flag |= D3D11_BIND_STREAM_OUTPUT; + if (value & BIND_RENDER_TARGET) + _flag |= D3D11_BIND_RENDER_TARGET; + if (value & BIND_DEPTH_STENCIL) + _flag |= D3D11_BIND_DEPTH_STENCIL; + if (value & BIND_UNORDERED_ACCESS) + _flag |= D3D11_BIND_UNORDERED_ACCESS; + + return _flag; } - else + constexpr uint32_t _ParseCPUAccessFlags(uint32_t value) { - if (value & COLOR_WRITE_ENABLE_RED) - _flag |= D3D11_COLOR_WRITE_ENABLE_RED; - if (value & COLOR_WRITE_ENABLE_GREEN) - _flag |= D3D11_COLOR_WRITE_ENABLE_GREEN; - if (value & COLOR_WRITE_ENABLE_BLUE) - _flag |= D3D11_COLOR_WRITE_ENABLE_BLUE; - if (value & COLOR_WRITE_ENABLE_ALPHA) - _flag |= D3D11_COLOR_WRITE_ENABLE_ALPHA; + uint32_t _flag = 0; + + if (value & CPU_ACCESS_WRITE) + _flag |= D3D11_CPU_ACCESS_WRITE; + if (value & CPU_ACCESS_READ) + _flag |= D3D11_CPU_ACCESS_READ; + + return _flag; + } + constexpr uint32_t _ParseResourceMiscFlags(uint32_t value) + { + uint32_t _flag = 0; + + if (value & RESOURCE_MISC_SHARED) + _flag |= D3D11_RESOURCE_MISC_SHARED; + if (value & RESOURCE_MISC_TEXTURECUBE) + _flag |= D3D11_RESOURCE_MISC_TEXTURECUBE; + if (value & RESOURCE_MISC_INDIRECT_ARGS) + _flag |= D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS; + if (value & RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) + _flag |= D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; + if (value & RESOURCE_MISC_BUFFER_STRUCTURED) + _flag |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + if (value & RESOURCE_MISC_TILED) + _flag |= D3D11_RESOURCE_MISC_TILED; + + return _flag; + } + constexpr uint32_t _ParseColorWriteMask(uint32_t value) + { + uint32_t _flag = 0; + + if (value == D3D11_COLOR_WRITE_ENABLE_ALL) + { + return D3D11_COLOR_WRITE_ENABLE_ALL; + } + else + { + if (value & COLOR_WRITE_ENABLE_RED) + _flag |= D3D11_COLOR_WRITE_ENABLE_RED; + if (value & COLOR_WRITE_ENABLE_GREEN) + _flag |= D3D11_COLOR_WRITE_ENABLE_GREEN; + if (value & COLOR_WRITE_ENABLE_BLUE) + _flag |= D3D11_COLOR_WRITE_ENABLE_BLUE; + if (value & COLOR_WRITE_ENABLE_ALPHA) + _flag |= D3D11_COLOR_WRITE_ENABLE_ALPHA; + } + + return _flag; } - return _flag; -} - -constexpr D3D11_FILTER _ConvertFilter(FILTER value) -{ - switch (value) + constexpr D3D11_FILTER _ConvertFilter(FILTER value) { - case FILTER_MIN_MAG_MIP_POINT: + switch (value) + { + case FILTER_MIN_MAG_MIP_POINT: + return D3D11_FILTER_MIN_MAG_MIP_POINT; + break; + case FILTER_MIN_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MIN_POINT_MAG_MIP_LINEAR: + return D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR; + break; + case FILTER_MIN_LINEAR_MAG_MIP_POINT: + return D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT; + break; + case FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MIN_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MIN_MAG_MIP_LINEAR: + return D3D11_FILTER_MIN_MAG_MIP_LINEAR; + break; + case FILTER_ANISOTROPIC: + return D3D11_FILTER_ANISOTROPIC; + break; + case FILTER_COMPARISON_MIN_MAG_MIP_POINT: + return D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT; + break; + case FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR; + break; + case FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT; + break; + case FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR: + return D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR; + break; + case FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT: + return D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT; + break; + case FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR; + break; + case FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; + break; + case FILTER_COMPARISON_MIN_MAG_MIP_LINEAR: + return D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR; + break; + case FILTER_COMPARISON_ANISOTROPIC: + return D3D11_FILTER_COMPARISON_ANISOTROPIC; + break; + case FILTER_MINIMUM_MIN_MAG_MIP_POINT: + return D3D11_FILTER_MINIMUM_MIN_MAG_MIP_POINT; + break; + case FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR: + return D3D11_FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR; + break; + case FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT: + return D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT; + break; + case FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MINIMUM_MIN_MAG_MIP_LINEAR: + return D3D11_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR; + break; + case FILTER_MINIMUM_ANISOTROPIC: + return D3D11_FILTER_MINIMUM_ANISOTROPIC; + break; + case FILTER_MAXIMUM_MIN_MAG_MIP_POINT: + return D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_POINT; + break; + case FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR: + return D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR; + break; + case FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT: + return D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT; + break; + case FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR: + return D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR; + break; + case FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT: + return D3D11_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT; + break; + case FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR: + return D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR; + break; + case FILTER_MAXIMUM_ANISOTROPIC: + return D3D11_FILTER_MAXIMUM_ANISOTROPIC; + break; + default: + break; + } return D3D11_FILTER_MIN_MAG_MIP_POINT; - break; - case FILTER_MIN_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MIN_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MIN_POINT_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MIN_POINT_MAG_MIP_LINEAR: - return D3D11_FILTER_MIN_POINT_MAG_MIP_LINEAR; - break; - case FILTER_MIN_LINEAR_MAG_MIP_POINT: - return D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT; - break; - case FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MIN_LINEAR_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MIN_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MIN_MAG_MIP_LINEAR: - return D3D11_FILTER_MIN_MAG_MIP_LINEAR; - break; - case FILTER_ANISOTROPIC: - return D3D11_FILTER_ANISOTROPIC; - break; - case FILTER_COMPARISON_MIN_MAG_MIP_POINT: - return D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT; - break; - case FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_COMPARISON_MIN_MAG_POINT_MIP_LINEAR; - break; - case FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT; - break; - case FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR: - return D3D11_FILTER_COMPARISON_MIN_POINT_MAG_MIP_LINEAR; - break; - case FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT: - return D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_MIP_POINT; - break; - case FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR; - break; - case FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; - break; - case FILTER_COMPARISON_MIN_MAG_MIP_LINEAR: - return D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR; - break; - case FILTER_COMPARISON_ANISOTROPIC: - return D3D11_FILTER_COMPARISON_ANISOTROPIC; - break; - case FILTER_MINIMUM_MIN_MAG_MIP_POINT: - return D3D11_FILTER_MINIMUM_MIN_MAG_MIP_POINT; - break; - case FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MINIMUM_MIN_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR: - return D3D11_FILTER_MINIMUM_MIN_POINT_MAG_MIP_LINEAR; - break; - case FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT: - return D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_MIP_POINT; - break; - case FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MINIMUM_MIN_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MINIMUM_MIN_MAG_MIP_LINEAR: - return D3D11_FILTER_MINIMUM_MIN_MAG_MIP_LINEAR; - break; - case FILTER_MINIMUM_ANISOTROPIC: - return D3D11_FILTER_MINIMUM_ANISOTROPIC; - break; - case FILTER_MAXIMUM_MIN_MAG_MIP_POINT: - return D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_POINT; - break; - case FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MAXIMUM_MIN_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR: - return D3D11_FILTER_MAXIMUM_MIN_POINT_MAG_MIP_LINEAR; - break; - case FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT: - return D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_MIP_POINT; - break; - case FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR: - return D3D11_FILTER_MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR; - break; - case FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT: - return D3D11_FILTER_MAXIMUM_MIN_MAG_LINEAR_MIP_POINT; - break; - case FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR: - return D3D11_FILTER_MAXIMUM_MIN_MAG_MIP_LINEAR; - break; - case FILTER_MAXIMUM_ANISOTROPIC: - return D3D11_FILTER_MAXIMUM_ANISOTROPIC; - break; - default: - break; } - return D3D11_FILTER_MIN_MAG_MIP_POINT; -} -constexpr D3D11_TEXTURE_ADDRESS_MODE _ConvertTextureAddressMode(TEXTURE_ADDRESS_MODE value) -{ - switch (value) + constexpr D3D11_TEXTURE_ADDRESS_MODE _ConvertTextureAddressMode(TEXTURE_ADDRESS_MODE value) { - case TEXTURE_ADDRESS_WRAP: + switch (value) + { + case TEXTURE_ADDRESS_WRAP: + return D3D11_TEXTURE_ADDRESS_WRAP; + break; + case TEXTURE_ADDRESS_MIRROR: + return D3D11_TEXTURE_ADDRESS_MIRROR; + break; + case TEXTURE_ADDRESS_CLAMP: + return D3D11_TEXTURE_ADDRESS_CLAMP; + break; + case TEXTURE_ADDRESS_BORDER: + return D3D11_TEXTURE_ADDRESS_BORDER; + break; + default: + break; + } return D3D11_TEXTURE_ADDRESS_WRAP; - break; - case TEXTURE_ADDRESS_MIRROR: - return D3D11_TEXTURE_ADDRESS_MIRROR; - break; - case TEXTURE_ADDRESS_CLAMP: - return D3D11_TEXTURE_ADDRESS_CLAMP; - break; - case TEXTURE_ADDRESS_BORDER: - return D3D11_TEXTURE_ADDRESS_BORDER; - break; - default: - break; } - return D3D11_TEXTURE_ADDRESS_WRAP; -} -constexpr D3D11_COMPARISON_FUNC _ConvertComparisonFunc(COMPARISON_FUNC value) -{ - switch (value) + constexpr D3D11_COMPARISON_FUNC _ConvertComparisonFunc(COMPARISON_FUNC value) { - case COMPARISON_NEVER: + switch (value) + { + case COMPARISON_NEVER: + return D3D11_COMPARISON_NEVER; + break; + case COMPARISON_LESS: + return D3D11_COMPARISON_LESS; + break; + case COMPARISON_EQUAL: + return D3D11_COMPARISON_EQUAL; + break; + case COMPARISON_LESS_EQUAL: + return D3D11_COMPARISON_LESS_EQUAL; + break; + case COMPARISON_GREATER: + return D3D11_COMPARISON_GREATER; + break; + case COMPARISON_NOT_EQUAL: + return D3D11_COMPARISON_NOT_EQUAL; + break; + case COMPARISON_GREATER_EQUAL: + return D3D11_COMPARISON_GREATER_EQUAL; + break; + case COMPARISON_ALWAYS: + return D3D11_COMPARISON_ALWAYS; + break; + default: + break; + } return D3D11_COMPARISON_NEVER; - break; - case COMPARISON_LESS: - return D3D11_COMPARISON_LESS; - break; - case COMPARISON_EQUAL: - return D3D11_COMPARISON_EQUAL; - break; - case COMPARISON_LESS_EQUAL: - return D3D11_COMPARISON_LESS_EQUAL; - break; - case COMPARISON_GREATER: - return D3D11_COMPARISON_GREATER; - break; - case COMPARISON_NOT_EQUAL: - return D3D11_COMPARISON_NOT_EQUAL; - break; - case COMPARISON_GREATER_EQUAL: - return D3D11_COMPARISON_GREATER_EQUAL; - break; - case COMPARISON_ALWAYS: - return D3D11_COMPARISON_ALWAYS; - break; - default: - break; } - return D3D11_COMPARISON_NEVER; -} -constexpr D3D11_FILL_MODE _ConvertFillMode(FILL_MODE value) -{ - switch (value) + constexpr D3D11_FILL_MODE _ConvertFillMode(FILL_MODE value) { - case FILL_WIREFRAME: + switch (value) + { + case FILL_WIREFRAME: + return D3D11_FILL_WIREFRAME; + break; + case FILL_SOLID: + return D3D11_FILL_SOLID; + break; + default: + break; + } return D3D11_FILL_WIREFRAME; - break; - case FILL_SOLID: - return D3D11_FILL_SOLID; - break; - default: - break; } - return D3D11_FILL_WIREFRAME; -} -constexpr D3D11_CULL_MODE _ConvertCullMode(CULL_MODE value) -{ - switch (value) + constexpr D3D11_CULL_MODE _ConvertCullMode(CULL_MODE value) { - case CULL_NONE: + switch (value) + { + case CULL_NONE: + return D3D11_CULL_NONE; + break; + case CULL_FRONT: + return D3D11_CULL_FRONT; + break; + case CULL_BACK: + return D3D11_CULL_BACK; + break; + default: + break; + } return D3D11_CULL_NONE; - break; - case CULL_FRONT: - return D3D11_CULL_FRONT; - break; - case CULL_BACK: - return D3D11_CULL_BACK; - break; - default: - break; } - return D3D11_CULL_NONE; -} -constexpr D3D11_DEPTH_WRITE_MASK _ConvertDepthWriteMask(DEPTH_WRITE_MASK value) -{ - switch (value) + constexpr D3D11_DEPTH_WRITE_MASK _ConvertDepthWriteMask(DEPTH_WRITE_MASK value) { - case DEPTH_WRITE_MASK_ZERO: + switch (value) + { + case DEPTH_WRITE_MASK_ZERO: + return D3D11_DEPTH_WRITE_MASK_ZERO; + break; + case DEPTH_WRITE_MASK_ALL: + return D3D11_DEPTH_WRITE_MASK_ALL; + break; + default: + break; + } return D3D11_DEPTH_WRITE_MASK_ZERO; - break; - case DEPTH_WRITE_MASK_ALL: - return D3D11_DEPTH_WRITE_MASK_ALL; - break; - default: - break; } - return D3D11_DEPTH_WRITE_MASK_ZERO; -} -constexpr D3D11_STENCIL_OP _ConvertStencilOp(STENCIL_OP value) -{ - switch (value) + constexpr D3D11_STENCIL_OP _ConvertStencilOp(STENCIL_OP value) { - case STENCIL_OP_KEEP: + switch (value) + { + case STENCIL_OP_KEEP: + return D3D11_STENCIL_OP_KEEP; + break; + case STENCIL_OP_ZERO: + return D3D11_STENCIL_OP_ZERO; + break; + case STENCIL_OP_REPLACE: + return D3D11_STENCIL_OP_REPLACE; + break; + case STENCIL_OP_INCR_SAT: + return D3D11_STENCIL_OP_INCR_SAT; + break; + case STENCIL_OP_DECR_SAT: + return D3D11_STENCIL_OP_DECR_SAT; + break; + case STENCIL_OP_INVERT: + return D3D11_STENCIL_OP_INVERT; + break; + case STENCIL_OP_INCR: + return D3D11_STENCIL_OP_INCR; + break; + case STENCIL_OP_DECR: + return D3D11_STENCIL_OP_DECR; + break; + default: + break; + } return D3D11_STENCIL_OP_KEEP; - break; - case STENCIL_OP_ZERO: - return D3D11_STENCIL_OP_ZERO; - break; - case STENCIL_OP_REPLACE: - return D3D11_STENCIL_OP_REPLACE; - break; - case STENCIL_OP_INCR_SAT: - return D3D11_STENCIL_OP_INCR_SAT; - break; - case STENCIL_OP_DECR_SAT: - return D3D11_STENCIL_OP_DECR_SAT; - break; - case STENCIL_OP_INVERT: - return D3D11_STENCIL_OP_INVERT; - break; - case STENCIL_OP_INCR: - return D3D11_STENCIL_OP_INCR; - break; - case STENCIL_OP_DECR: - return D3D11_STENCIL_OP_DECR; - break; - default: - break; } - return D3D11_STENCIL_OP_KEEP; -} -constexpr D3D11_BLEND _ConvertBlend(BLEND value) -{ - switch (value) + constexpr D3D11_BLEND _ConvertBlend(BLEND value) { - case BLEND_ZERO: + switch (value) + { + case BLEND_ZERO: + return D3D11_BLEND_ZERO; + break; + case BLEND_ONE: + return D3D11_BLEND_ONE; + break; + case BLEND_SRC_COLOR: + return D3D11_BLEND_SRC_COLOR; + break; + case BLEND_INV_SRC_COLOR: + return D3D11_BLEND_INV_SRC_COLOR; + break; + case BLEND_SRC_ALPHA: + return D3D11_BLEND_SRC_ALPHA; + break; + case BLEND_INV_SRC_ALPHA: + return D3D11_BLEND_INV_SRC_ALPHA; + break; + case BLEND_DEST_ALPHA: + return D3D11_BLEND_DEST_ALPHA; + break; + case BLEND_INV_DEST_ALPHA: + return D3D11_BLEND_INV_DEST_ALPHA; + break; + case BLEND_DEST_COLOR: + return D3D11_BLEND_DEST_COLOR; + break; + case BLEND_INV_DEST_COLOR: + return D3D11_BLEND_INV_DEST_COLOR; + break; + case BLEND_SRC_ALPHA_SAT: + return D3D11_BLEND_SRC_ALPHA_SAT; + break; + case BLEND_BLEND_FACTOR: + return D3D11_BLEND_BLEND_FACTOR; + break; + case BLEND_INV_BLEND_FACTOR: + return D3D11_BLEND_INV_BLEND_FACTOR; + break; + case BLEND_SRC1_COLOR: + return D3D11_BLEND_SRC1_COLOR; + break; + case BLEND_INV_SRC1_COLOR: + return D3D11_BLEND_INV_SRC1_COLOR; + break; + case BLEND_SRC1_ALPHA: + return D3D11_BLEND_SRC1_ALPHA; + break; + case BLEND_INV_SRC1_ALPHA: + return D3D11_BLEND_INV_SRC1_ALPHA; + break; + default: + break; + } return D3D11_BLEND_ZERO; - break; - case BLEND_ONE: - return D3D11_BLEND_ONE; - break; - case BLEND_SRC_COLOR: - return D3D11_BLEND_SRC_COLOR; - break; - case BLEND_INV_SRC_COLOR: - return D3D11_BLEND_INV_SRC_COLOR; - break; - case BLEND_SRC_ALPHA: - return D3D11_BLEND_SRC_ALPHA; - break; - case BLEND_INV_SRC_ALPHA: - return D3D11_BLEND_INV_SRC_ALPHA; - break; - case BLEND_DEST_ALPHA: - return D3D11_BLEND_DEST_ALPHA; - break; - case BLEND_INV_DEST_ALPHA: - return D3D11_BLEND_INV_DEST_ALPHA; - break; - case BLEND_DEST_COLOR: - return D3D11_BLEND_DEST_COLOR; - break; - case BLEND_INV_DEST_COLOR: - return D3D11_BLEND_INV_DEST_COLOR; - break; - case BLEND_SRC_ALPHA_SAT: - return D3D11_BLEND_SRC_ALPHA_SAT; - break; - case BLEND_BLEND_FACTOR: - return D3D11_BLEND_BLEND_FACTOR; - break; - case BLEND_INV_BLEND_FACTOR: - return D3D11_BLEND_INV_BLEND_FACTOR; - break; - case BLEND_SRC1_COLOR: - return D3D11_BLEND_SRC1_COLOR; - break; - case BLEND_INV_SRC1_COLOR: - return D3D11_BLEND_INV_SRC1_COLOR; - break; - case BLEND_SRC1_ALPHA: - return D3D11_BLEND_SRC1_ALPHA; - break; - case BLEND_INV_SRC1_ALPHA: - return D3D11_BLEND_INV_SRC1_ALPHA; - break; - default: - break; } - return D3D11_BLEND_ZERO; -} -constexpr D3D11_BLEND_OP _ConvertBlendOp(BLEND_OP value) -{ - switch (value) + constexpr D3D11_BLEND_OP _ConvertBlendOp(BLEND_OP value) { - case BLEND_OP_ADD: + switch (value) + { + case BLEND_OP_ADD: + return D3D11_BLEND_OP_ADD; + break; + case BLEND_OP_SUBTRACT: + return D3D11_BLEND_OP_SUBTRACT; + break; + case BLEND_OP_REV_SUBTRACT: + return D3D11_BLEND_OP_REV_SUBTRACT; + break; + case BLEND_OP_MIN: + return D3D11_BLEND_OP_MIN; + break; + case BLEND_OP_MAX: + return D3D11_BLEND_OP_MAX; + break; + default: + break; + } return D3D11_BLEND_OP_ADD; - break; - case BLEND_OP_SUBTRACT: - return D3D11_BLEND_OP_SUBTRACT; - break; - case BLEND_OP_REV_SUBTRACT: - return D3D11_BLEND_OP_REV_SUBTRACT; - break; - case BLEND_OP_MIN: - return D3D11_BLEND_OP_MIN; - break; - case BLEND_OP_MAX: - return D3D11_BLEND_OP_MAX; - break; - default: - break; } - return D3D11_BLEND_OP_ADD; -} -constexpr D3D11_USAGE _ConvertUsage(USAGE value) -{ - switch (value) + constexpr D3D11_USAGE _ConvertUsage(USAGE value) { - case USAGE_DEFAULT: + switch (value) + { + case USAGE_DEFAULT: + return D3D11_USAGE_DEFAULT; + break; + case USAGE_IMMUTABLE: + return D3D11_USAGE_IMMUTABLE; + break; + case USAGE_DYNAMIC: + return D3D11_USAGE_DYNAMIC; + break; + case USAGE_STAGING: + return D3D11_USAGE_STAGING; + break; + default: + break; + } return D3D11_USAGE_DEFAULT; - break; - case USAGE_IMMUTABLE: - return D3D11_USAGE_IMMUTABLE; - break; - case USAGE_DYNAMIC: - return D3D11_USAGE_DYNAMIC; - break; - case USAGE_STAGING: - return D3D11_USAGE_STAGING; - break; - default: - break; } - return D3D11_USAGE_DEFAULT; -} -constexpr D3D11_INPUT_CLASSIFICATION _ConvertInputClassification(INPUT_CLASSIFICATION value) -{ - switch (value) + constexpr D3D11_INPUT_CLASSIFICATION _ConvertInputClassification(INPUT_CLASSIFICATION value) { - case INPUT_PER_VERTEX_DATA: + switch (value) + { + case INPUT_PER_VERTEX_DATA: + return D3D11_INPUT_PER_VERTEX_DATA; + break; + case INPUT_PER_INSTANCE_DATA: + return D3D11_INPUT_PER_INSTANCE_DATA; + break; + default: + break; + } return D3D11_INPUT_PER_VERTEX_DATA; - break; - case INPUT_PER_INSTANCE_DATA: - return D3D11_INPUT_PER_INSTANCE_DATA; - break; - default: - break; } - return D3D11_INPUT_PER_VERTEX_DATA; -} -constexpr DXGI_FORMAT _ConvertFormat(FORMAT value) -{ - switch (value) + constexpr DXGI_FORMAT _ConvertFormat(FORMAT value) { - case FORMAT_UNKNOWN: + switch (value) + { + case FORMAT_UNKNOWN: + return DXGI_FORMAT_UNKNOWN; + break; + case FORMAT_R32G32B32A32_FLOAT: + return DXGI_FORMAT_R32G32B32A32_FLOAT; + break; + case FORMAT_R32G32B32A32_UINT: + return DXGI_FORMAT_R32G32B32A32_UINT; + break; + case FORMAT_R32G32B32A32_SINT: + return DXGI_FORMAT_R32G32B32A32_SINT; + break; + case FORMAT_R32G32B32_FLOAT: + return DXGI_FORMAT_R32G32B32_FLOAT; + break; + case FORMAT_R32G32B32_UINT: + return DXGI_FORMAT_R32G32B32_UINT; + break; + case FORMAT_R32G32B32_SINT: + return DXGI_FORMAT_R32G32B32_SINT; + break; + case FORMAT_R16G16B16A16_FLOAT: + return DXGI_FORMAT_R16G16B16A16_FLOAT; + break; + case FORMAT_R16G16B16A16_UNORM: + return DXGI_FORMAT_R16G16B16A16_UNORM; + break; + case FORMAT_R16G16B16A16_UINT: + return DXGI_FORMAT_R16G16B16A16_UINT; + break; + case FORMAT_R16G16B16A16_SNORM: + return DXGI_FORMAT_R16G16B16A16_SNORM; + break; + case FORMAT_R16G16B16A16_SINT: + return DXGI_FORMAT_R16G16B16A16_SINT; + break; + case FORMAT_R32G32_FLOAT: + return DXGI_FORMAT_R32G32_FLOAT; + break; + case FORMAT_R32G32_UINT: + return DXGI_FORMAT_R32G32_UINT; + break; + case FORMAT_R32G32_SINT: + return DXGI_FORMAT_R32G32_SINT; + break; + case FORMAT_R32G8X24_TYPELESS: + return DXGI_FORMAT_R32G8X24_TYPELESS; + break; + case FORMAT_D32_FLOAT_S8X24_UINT: + return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; + break; + case FORMAT_R10G10B10A2_UNORM: + return DXGI_FORMAT_R10G10B10A2_UNORM; + break; + case FORMAT_R10G10B10A2_UINT: + return DXGI_FORMAT_R10G10B10A2_UINT; + break; + case FORMAT_R11G11B10_FLOAT: + return DXGI_FORMAT_R11G11B10_FLOAT; + break; + case FORMAT_R8G8B8A8_UNORM: + return DXGI_FORMAT_R8G8B8A8_UNORM; + break; + case FORMAT_R8G8B8A8_UNORM_SRGB: + return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + break; + case FORMAT_R8G8B8A8_UINT: + return DXGI_FORMAT_R8G8B8A8_UINT; + break; + case FORMAT_R8G8B8A8_SNORM: + return DXGI_FORMAT_R8G8B8A8_SNORM; + break; + case FORMAT_R8G8B8A8_SINT: + return DXGI_FORMAT_R8G8B8A8_SINT; + break; + case FORMAT_R16G16_FLOAT: + return DXGI_FORMAT_R16G16_FLOAT; + break; + case FORMAT_R16G16_UNORM: + return DXGI_FORMAT_R16G16_UNORM; + break; + case FORMAT_R16G16_UINT: + return DXGI_FORMAT_R16G16_UINT; + break; + case FORMAT_R16G16_SNORM: + return DXGI_FORMAT_R16G16_SNORM; + break; + case FORMAT_R16G16_SINT: + return DXGI_FORMAT_R16G16_SINT; + break; + case FORMAT_R32_TYPELESS: + return DXGI_FORMAT_R32_TYPELESS; + break; + case FORMAT_D32_FLOAT: + return DXGI_FORMAT_D32_FLOAT; + break; + case FORMAT_R32_FLOAT: + return DXGI_FORMAT_R32_FLOAT; + break; + case FORMAT_R32_UINT: + return DXGI_FORMAT_R32_UINT; + break; + case FORMAT_R32_SINT: + return DXGI_FORMAT_R32_SINT; + break; + case FORMAT_R24G8_TYPELESS: + return DXGI_FORMAT_R24G8_TYPELESS; + break; + case FORMAT_D24_UNORM_S8_UINT: + return DXGI_FORMAT_D24_UNORM_S8_UINT; + break; + case FORMAT_R8G8_UNORM: + return DXGI_FORMAT_R8G8_UNORM; + break; + case FORMAT_R8G8_UINT: + return DXGI_FORMAT_R8G8_UINT; + break; + case FORMAT_R8G8_SNORM: + return DXGI_FORMAT_R8G8_SNORM; + break; + case FORMAT_R8G8_SINT: + return DXGI_FORMAT_R8G8_SINT; + break; + case FORMAT_R16_TYPELESS: + return DXGI_FORMAT_R16_TYPELESS; + break; + case FORMAT_R16_FLOAT: + return DXGI_FORMAT_R16_FLOAT; + break; + case FORMAT_D16_UNORM: + return DXGI_FORMAT_D16_UNORM; + break; + case FORMAT_R16_UNORM: + return DXGI_FORMAT_R16_UNORM; + break; + case FORMAT_R16_UINT: + return DXGI_FORMAT_R16_UINT; + break; + case FORMAT_R16_SNORM: + return DXGI_FORMAT_R16_SNORM; + break; + case FORMAT_R16_SINT: + return DXGI_FORMAT_R16_SINT; + break; + case FORMAT_R8_UNORM: + return DXGI_FORMAT_R8_UNORM; + break; + case FORMAT_R8_UINT: + return DXGI_FORMAT_R8_UINT; + break; + case FORMAT_R8_SNORM: + return DXGI_FORMAT_R8_SNORM; + break; + case FORMAT_R8_SINT: + return DXGI_FORMAT_R8_SINT; + break; + case FORMAT_BC1_UNORM: + return DXGI_FORMAT_BC1_UNORM; + break; + case FORMAT_BC1_UNORM_SRGB: + return DXGI_FORMAT_BC1_UNORM_SRGB; + break; + case FORMAT_BC2_UNORM: + return DXGI_FORMAT_BC2_UNORM; + break; + case FORMAT_BC2_UNORM_SRGB: + return DXGI_FORMAT_BC2_UNORM_SRGB; + break; + case FORMAT_BC3_UNORM: + return DXGI_FORMAT_BC3_UNORM; + break; + case FORMAT_BC3_UNORM_SRGB: + return DXGI_FORMAT_BC3_UNORM_SRGB; + break; + case FORMAT_BC4_UNORM: + return DXGI_FORMAT_BC4_UNORM; + break; + case FORMAT_BC4_SNORM: + return DXGI_FORMAT_BC4_SNORM; + break; + case FORMAT_BC5_UNORM: + return DXGI_FORMAT_BC5_UNORM; + break; + case FORMAT_BC5_SNORM: + return DXGI_FORMAT_BC5_SNORM; + break; + case FORMAT_B8G8R8A8_UNORM: + return DXGI_FORMAT_B8G8R8A8_UNORM; + break; + case FORMAT_B8G8R8A8_UNORM_SRGB: + return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + break; + case FORMAT_BC6H_UF16: + return DXGI_FORMAT_BC6H_UF16; + break; + case FORMAT_BC6H_SF16: + return DXGI_FORMAT_BC6H_SF16; + break; + case FORMAT_BC7_UNORM: + return DXGI_FORMAT_BC7_UNORM; + break; + case FORMAT_BC7_UNORM_SRGB: + return DXGI_FORMAT_BC7_UNORM_SRGB; + break; + } return DXGI_FORMAT_UNKNOWN; - break; - case FORMAT_R32G32B32A32_FLOAT: - return DXGI_FORMAT_R32G32B32A32_FLOAT; - break; - case FORMAT_R32G32B32A32_UINT: - return DXGI_FORMAT_R32G32B32A32_UINT; - break; - case FORMAT_R32G32B32A32_SINT: - return DXGI_FORMAT_R32G32B32A32_SINT; - break; - case FORMAT_R32G32B32_FLOAT: - return DXGI_FORMAT_R32G32B32_FLOAT; - break; - case FORMAT_R32G32B32_UINT: - return DXGI_FORMAT_R32G32B32_UINT; - break; - case FORMAT_R32G32B32_SINT: - return DXGI_FORMAT_R32G32B32_SINT; - break; - case FORMAT_R16G16B16A16_FLOAT: - return DXGI_FORMAT_R16G16B16A16_FLOAT; - break; - case FORMAT_R16G16B16A16_UNORM: - return DXGI_FORMAT_R16G16B16A16_UNORM; - break; - case FORMAT_R16G16B16A16_UINT: - return DXGI_FORMAT_R16G16B16A16_UINT; - break; - case FORMAT_R16G16B16A16_SNORM: - return DXGI_FORMAT_R16G16B16A16_SNORM; - break; - case FORMAT_R16G16B16A16_SINT: - return DXGI_FORMAT_R16G16B16A16_SINT; - break; - case FORMAT_R32G32_FLOAT: - return DXGI_FORMAT_R32G32_FLOAT; - break; - case FORMAT_R32G32_UINT: - return DXGI_FORMAT_R32G32_UINT; - break; - case FORMAT_R32G32_SINT: - return DXGI_FORMAT_R32G32_SINT; - break; - case FORMAT_R32G8X24_TYPELESS: - return DXGI_FORMAT_R32G8X24_TYPELESS; - break; - case FORMAT_D32_FLOAT_S8X24_UINT: - return DXGI_FORMAT_D32_FLOAT_S8X24_UINT; - break; - case FORMAT_R10G10B10A2_UNORM: - return DXGI_FORMAT_R10G10B10A2_UNORM; - break; - case FORMAT_R10G10B10A2_UINT: - return DXGI_FORMAT_R10G10B10A2_UINT; - break; - case FORMAT_R11G11B10_FLOAT: - return DXGI_FORMAT_R11G11B10_FLOAT; - break; - case FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM; - break; - case FORMAT_R8G8B8A8_UNORM_SRGB: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - break; - case FORMAT_R8G8B8A8_UINT: - return DXGI_FORMAT_R8G8B8A8_UINT; - break; - case FORMAT_R8G8B8A8_SNORM: - return DXGI_FORMAT_R8G8B8A8_SNORM; - break; - case FORMAT_R8G8B8A8_SINT: - return DXGI_FORMAT_R8G8B8A8_SINT; - break; - case FORMAT_R16G16_FLOAT: - return DXGI_FORMAT_R16G16_FLOAT; - break; - case FORMAT_R16G16_UNORM: - return DXGI_FORMAT_R16G16_UNORM; - break; - case FORMAT_R16G16_UINT: - return DXGI_FORMAT_R16G16_UINT; - break; - case FORMAT_R16G16_SNORM: - return DXGI_FORMAT_R16G16_SNORM; - break; - case FORMAT_R16G16_SINT: - return DXGI_FORMAT_R16G16_SINT; - break; - case FORMAT_R32_TYPELESS: - return DXGI_FORMAT_R32_TYPELESS; - break; - case FORMAT_D32_FLOAT: - return DXGI_FORMAT_D32_FLOAT; - break; - case FORMAT_R32_FLOAT: - return DXGI_FORMAT_R32_FLOAT; - break; - case FORMAT_R32_UINT: - return DXGI_FORMAT_R32_UINT; - break; - case FORMAT_R32_SINT: - return DXGI_FORMAT_R32_SINT; - break; - case FORMAT_R24G8_TYPELESS: - return DXGI_FORMAT_R24G8_TYPELESS; - break; - case FORMAT_D24_UNORM_S8_UINT: - return DXGI_FORMAT_D24_UNORM_S8_UINT; - break; - case FORMAT_R8G8_UNORM: - return DXGI_FORMAT_R8G8_UNORM; - break; - case FORMAT_R8G8_UINT: - return DXGI_FORMAT_R8G8_UINT; - break; - case FORMAT_R8G8_SNORM: - return DXGI_FORMAT_R8G8_SNORM; - break; - case FORMAT_R8G8_SINT: - return DXGI_FORMAT_R8G8_SINT; - break; - case FORMAT_R16_TYPELESS: - return DXGI_FORMAT_R16_TYPELESS; - break; - case FORMAT_R16_FLOAT: - return DXGI_FORMAT_R16_FLOAT; - break; - case FORMAT_D16_UNORM: - return DXGI_FORMAT_D16_UNORM; - break; - case FORMAT_R16_UNORM: - return DXGI_FORMAT_R16_UNORM; - break; - case FORMAT_R16_UINT: - return DXGI_FORMAT_R16_UINT; - break; - case FORMAT_R16_SNORM: - return DXGI_FORMAT_R16_SNORM; - break; - case FORMAT_R16_SINT: - return DXGI_FORMAT_R16_SINT; - break; - case FORMAT_R8_UNORM: - return DXGI_FORMAT_R8_UNORM; - break; - case FORMAT_R8_UINT: - return DXGI_FORMAT_R8_UINT; - break; - case FORMAT_R8_SNORM: - return DXGI_FORMAT_R8_SNORM; - break; - case FORMAT_R8_SINT: - return DXGI_FORMAT_R8_SINT; - break; - case FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM; - break; - case FORMAT_BC1_UNORM_SRGB: - return DXGI_FORMAT_BC1_UNORM_SRGB; - break; - case FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM; - break; - case FORMAT_BC2_UNORM_SRGB: - return DXGI_FORMAT_BC2_UNORM_SRGB; - break; - case FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM; - break; - case FORMAT_BC3_UNORM_SRGB: - return DXGI_FORMAT_BC3_UNORM_SRGB; - break; - case FORMAT_BC4_UNORM: - return DXGI_FORMAT_BC4_UNORM; - break; - case FORMAT_BC4_SNORM: - return DXGI_FORMAT_BC4_SNORM; - break; - case FORMAT_BC5_UNORM: - return DXGI_FORMAT_BC5_UNORM; - break; - case FORMAT_BC5_SNORM: - return DXGI_FORMAT_BC5_SNORM; - break; - case FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM; - break; - case FORMAT_B8G8R8A8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - break; - case FORMAT_BC6H_UF16: - return DXGI_FORMAT_BC6H_UF16; - break; - case FORMAT_BC6H_SF16: - return DXGI_FORMAT_BC6H_SF16; - break; - case FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM; - break; - case FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_BC7_UNORM_SRGB; - break; } - return DXGI_FORMAT_UNKNOWN; -} -inline D3D11_TEXTURE1D_DESC _ConvertTextureDesc1D(const TextureDesc* pDesc) -{ - D3D11_TEXTURE1D_DESC desc; - desc.Width = pDesc->Width; - desc.MipLevels = pDesc->MipLevels; - desc.ArraySize = pDesc->ArraySize; - desc.Format = _ConvertFormat(pDesc->Format); - desc.Usage = _ConvertUsage(pDesc->Usage); - desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); - - return desc; -} -inline D3D11_TEXTURE2D_DESC _ConvertTextureDesc2D(const TextureDesc* pDesc) -{ - D3D11_TEXTURE2D_DESC desc; - desc.Width = pDesc->Width; - desc.Height = pDesc->Height; - desc.MipLevels = pDesc->MipLevels; - desc.ArraySize = pDesc->ArraySize; - desc.Format = _ConvertFormat(pDesc->Format); - desc.SampleDesc.Count = pDesc->SampleCount; - desc.SampleDesc.Quality = 0; - desc.Usage = _ConvertUsage(pDesc->Usage); - desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); - - return desc; -} -inline D3D11_TEXTURE3D_DESC _ConvertTextureDesc3D(const TextureDesc* pDesc) -{ - D3D11_TEXTURE3D_DESC desc; - desc.Width = pDesc->Width; - desc.Height = pDesc->Height; - desc.Depth = pDesc->Depth; - desc.MipLevels = pDesc->MipLevels; - desc.Format = _ConvertFormat(pDesc->Format); - desc.Usage = _ConvertUsage(pDesc->Usage); - desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); - - return desc; -} -inline D3D11_SUBRESOURCE_DATA _ConvertSubresourceData(const SubresourceData& pInitialData) -{ - D3D11_SUBRESOURCE_DATA data; - data.pSysMem = pInitialData.pSysMem; - data.SysMemPitch = pInitialData.SysMemPitch; - data.SysMemSlicePitch = pInitialData.SysMemSlicePitch; - - return data; -} - - -// Native -> Engine converters - -constexpr uint32_t _ParseBindFlags_Inv(uint32_t value) -{ - uint32_t _flag = 0; - - if (value & D3D11_BIND_VERTEX_BUFFER) - _flag |= BIND_VERTEX_BUFFER; - if (value & D3D11_BIND_INDEX_BUFFER) - _flag |= BIND_INDEX_BUFFER; - if (value & D3D11_BIND_CONSTANT_BUFFER) - _flag |= BIND_CONSTANT_BUFFER; - if (value & D3D11_BIND_SHADER_RESOURCE) - _flag |= BIND_SHADER_RESOURCE; - if (value & D3D11_BIND_STREAM_OUTPUT) - _flag |= BIND_STREAM_OUTPUT; - if (value & D3D11_BIND_RENDER_TARGET) - _flag |= BIND_RENDER_TARGET; - if (value & D3D11_BIND_DEPTH_STENCIL) - _flag |= BIND_DEPTH_STENCIL; - if (value & D3D11_BIND_UNORDERED_ACCESS) - _flag |= BIND_UNORDERED_ACCESS; - - return _flag; -} -constexpr uint32_t _ParseCPUAccessFlags_Inv(uint32_t value) -{ - uint32_t _flag = 0; - - if (value & D3D11_CPU_ACCESS_WRITE) - _flag |= CPU_ACCESS_WRITE; - if (value & D3D11_CPU_ACCESS_READ) - _flag |= CPU_ACCESS_READ; - - return _flag; -} -constexpr uint32_t _ParseResourceMiscFlags_Inv(uint32_t value) -{ - uint32_t _flag = 0; - - if (value & D3D11_RESOURCE_MISC_SHARED) - _flag |= RESOURCE_MISC_SHARED; - if (value & D3D11_RESOURCE_MISC_TEXTURECUBE) - _flag |= RESOURCE_MISC_TEXTURECUBE; - if (value & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) - _flag |= RESOURCE_MISC_INDIRECT_ARGS; - if (value & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) - _flag |= RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; - if (value & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED) - _flag |= RESOURCE_MISC_BUFFER_STRUCTURED; - if (value & D3D11_RESOURCE_MISC_TILED) - _flag |= RESOURCE_MISC_TILED; - - return _flag; -} - -constexpr FORMAT _ConvertFormat_Inv(DXGI_FORMAT value) -{ - switch (value) + inline D3D11_TEXTURE1D_DESC _ConvertTextureDesc1D(const TextureDesc* pDesc) { - case DXGI_FORMAT_UNKNOWN: + D3D11_TEXTURE1D_DESC desc; + desc.Width = pDesc->Width; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat(pDesc->Format); + desc.Usage = _ConvertUsage(pDesc->Usage); + desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); + + return desc; + } + inline D3D11_TEXTURE2D_DESC _ConvertTextureDesc2D(const TextureDesc* pDesc) + { + D3D11_TEXTURE2D_DESC desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat(pDesc->Format); + desc.SampleDesc.Count = pDesc->SampleCount; + desc.SampleDesc.Quality = 0; + desc.Usage = _ConvertUsage(pDesc->Usage); + desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); + + return desc; + } + inline D3D11_TEXTURE3D_DESC _ConvertTextureDesc3D(const TextureDesc* pDesc) + { + D3D11_TEXTURE3D_DESC desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.Depth = pDesc->Depth; + desc.MipLevels = pDesc->MipLevels; + desc.Format = _ConvertFormat(pDesc->Format); + desc.Usage = _ConvertUsage(pDesc->Usage); + desc.BindFlags = _ParseBindFlags(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags(pDesc->MiscFlags); + + return desc; + } + inline D3D11_SUBRESOURCE_DATA _ConvertSubresourceData(const SubresourceData& pInitialData) + { + D3D11_SUBRESOURCE_DATA data; + data.pSysMem = pInitialData.pSysMem; + data.SysMemPitch = pInitialData.SysMemPitch; + data.SysMemSlicePitch = pInitialData.SysMemSlicePitch; + + return data; + } + + + // Native -> Engine converters + + constexpr uint32_t _ParseBindFlags_Inv(uint32_t value) + { + uint32_t _flag = 0; + + if (value & D3D11_BIND_VERTEX_BUFFER) + _flag |= BIND_VERTEX_BUFFER; + if (value & D3D11_BIND_INDEX_BUFFER) + _flag |= BIND_INDEX_BUFFER; + if (value & D3D11_BIND_CONSTANT_BUFFER) + _flag |= BIND_CONSTANT_BUFFER; + if (value & D3D11_BIND_SHADER_RESOURCE) + _flag |= BIND_SHADER_RESOURCE; + if (value & D3D11_BIND_STREAM_OUTPUT) + _flag |= BIND_STREAM_OUTPUT; + if (value & D3D11_BIND_RENDER_TARGET) + _flag |= BIND_RENDER_TARGET; + if (value & D3D11_BIND_DEPTH_STENCIL) + _flag |= BIND_DEPTH_STENCIL; + if (value & D3D11_BIND_UNORDERED_ACCESS) + _flag |= BIND_UNORDERED_ACCESS; + + return _flag; + } + constexpr uint32_t _ParseCPUAccessFlags_Inv(uint32_t value) + { + uint32_t _flag = 0; + + if (value & D3D11_CPU_ACCESS_WRITE) + _flag |= CPU_ACCESS_WRITE; + if (value & D3D11_CPU_ACCESS_READ) + _flag |= CPU_ACCESS_READ; + + return _flag; + } + constexpr uint32_t _ParseResourceMiscFlags_Inv(uint32_t value) + { + uint32_t _flag = 0; + + if (value & D3D11_RESOURCE_MISC_SHARED) + _flag |= RESOURCE_MISC_SHARED; + if (value & D3D11_RESOURCE_MISC_TEXTURECUBE) + _flag |= RESOURCE_MISC_TEXTURECUBE; + if (value & D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS) + _flag |= RESOURCE_MISC_INDIRECT_ARGS; + if (value & D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS) + _flag |= RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; + if (value & D3D11_RESOURCE_MISC_BUFFER_STRUCTURED) + _flag |= RESOURCE_MISC_BUFFER_STRUCTURED; + if (value & D3D11_RESOURCE_MISC_TILED) + _flag |= RESOURCE_MISC_TILED; + + return _flag; + } + + constexpr FORMAT _ConvertFormat_Inv(DXGI_FORMAT value) + { + switch (value) + { + case DXGI_FORMAT_UNKNOWN: + return FORMAT_UNKNOWN; + break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: + return FORMAT_R32G32B32A32_FLOAT; + break; + case DXGI_FORMAT_R32G32B32A32_UINT: + return FORMAT_R32G32B32A32_UINT; + break; + case DXGI_FORMAT_R32G32B32A32_SINT: + return FORMAT_R32G32B32A32_SINT; + break; + case DXGI_FORMAT_R32G32B32_FLOAT: + return FORMAT_R32G32B32_FLOAT; + break; + case DXGI_FORMAT_R32G32B32_UINT: + return FORMAT_R32G32B32_UINT; + break; + case DXGI_FORMAT_R32G32B32_SINT: + return FORMAT_R32G32B32_SINT; + break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: + return FORMAT_R16G16B16A16_FLOAT; + break; + case DXGI_FORMAT_R16G16B16A16_UNORM: + return FORMAT_R16G16B16A16_UNORM; + break; + case DXGI_FORMAT_R16G16B16A16_UINT: + return FORMAT_R16G16B16A16_UINT; + break; + case DXGI_FORMAT_R16G16B16A16_SNORM: + return FORMAT_R16G16B16A16_SNORM; + break; + case DXGI_FORMAT_R16G16B16A16_SINT: + return FORMAT_R16G16B16A16_SINT; + break; + case DXGI_FORMAT_R32G32_FLOAT: + return FORMAT_R32G32_FLOAT; + break; + case DXGI_FORMAT_R32G32_UINT: + return FORMAT_R32G32_UINT; + break; + case DXGI_FORMAT_R32G32_SINT: + return FORMAT_R32G32_SINT; + break; + case DXGI_FORMAT_R32G8X24_TYPELESS: + return FORMAT_R32G8X24_TYPELESS; + break; + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + return FORMAT_D32_FLOAT_S8X24_UINT; + break; + case DXGI_FORMAT_R10G10B10A2_UNORM: + return FORMAT_R10G10B10A2_UNORM; + break; + case DXGI_FORMAT_R10G10B10A2_UINT: + return FORMAT_R10G10B10A2_UINT; + break; + case DXGI_FORMAT_R11G11B10_FLOAT: + return FORMAT_R11G11B10_FLOAT; + break; + case DXGI_FORMAT_R8G8B8A8_UNORM: + return FORMAT_R8G8B8A8_UNORM; + break; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: + return FORMAT_R8G8B8A8_UNORM_SRGB; + break; + case DXGI_FORMAT_R8G8B8A8_UINT: + return FORMAT_R8G8B8A8_UINT; + break; + case DXGI_FORMAT_R8G8B8A8_SNORM: + return FORMAT_R8G8B8A8_SNORM; + break; + case DXGI_FORMAT_R8G8B8A8_SINT: + return FORMAT_R8G8B8A8_SINT; + break; + case DXGI_FORMAT_R16G16_FLOAT: + return FORMAT_R16G16_FLOAT; + break; + case DXGI_FORMAT_R16G16_UNORM: + return FORMAT_R16G16_UNORM; + break; + case DXGI_FORMAT_R16G16_UINT: + return FORMAT_R16G16_UINT; + break; + case DXGI_FORMAT_R16G16_SNORM: + return FORMAT_R16G16_SNORM; + break; + case DXGI_FORMAT_R16G16_SINT: + return FORMAT_R16G16_SINT; + break; + case DXGI_FORMAT_R32_TYPELESS: + return FORMAT_R32_TYPELESS; + break; + case DXGI_FORMAT_D32_FLOAT: + return FORMAT_D32_FLOAT; + break; + case DXGI_FORMAT_R32_FLOAT: + return FORMAT_R32_FLOAT; + break; + case DXGI_FORMAT_R32_UINT: + return FORMAT_R32_UINT; + break; + case DXGI_FORMAT_R32_SINT: + return FORMAT_R32_SINT; + break; + case DXGI_FORMAT_R24G8_TYPELESS: + return FORMAT_R24G8_TYPELESS; + break; + case DXGI_FORMAT_D24_UNORM_S8_UINT: + return FORMAT_D24_UNORM_S8_UINT; + break; + case DXGI_FORMAT_R8G8_UNORM: + return FORMAT_R8G8_UNORM; + break; + case DXGI_FORMAT_R8G8_UINT: + return FORMAT_R8G8_UINT; + break; + case DXGI_FORMAT_R8G8_SNORM: + return FORMAT_R8G8_SNORM; + break; + case DXGI_FORMAT_R8G8_SINT: + return FORMAT_R8G8_SINT; + break; + case DXGI_FORMAT_R16_TYPELESS: + return FORMAT_R16_TYPELESS; + break; + case DXGI_FORMAT_R16_FLOAT: + return FORMAT_R16_FLOAT; + break; + case DXGI_FORMAT_D16_UNORM: + return FORMAT_D16_UNORM; + break; + case DXGI_FORMAT_R16_UNORM: + return FORMAT_R16_UNORM; + break; + case DXGI_FORMAT_R16_UINT: + return FORMAT_R16_UINT; + break; + case DXGI_FORMAT_R16_SNORM: + return FORMAT_R16_SNORM; + break; + case DXGI_FORMAT_R16_SINT: + return FORMAT_R16_SINT; + break; + case DXGI_FORMAT_R8_UNORM: + return FORMAT_R8_UNORM; + break; + case DXGI_FORMAT_R8_UINT: + return FORMAT_R8_UINT; + break; + case DXGI_FORMAT_R8_SNORM: + return FORMAT_R8_SNORM; + break; + case DXGI_FORMAT_R8_SINT: + return FORMAT_R8_SINT; + break; + case DXGI_FORMAT_BC1_UNORM: + return FORMAT_BC1_UNORM; + break; + case DXGI_FORMAT_BC1_UNORM_SRGB: + return FORMAT_BC1_UNORM_SRGB; + break; + case DXGI_FORMAT_BC2_UNORM: + return FORMAT_BC2_UNORM; + break; + case DXGI_FORMAT_BC2_UNORM_SRGB: + return FORMAT_BC2_UNORM_SRGB; + break; + case DXGI_FORMAT_BC3_UNORM: + return FORMAT_BC3_UNORM; + break; + case DXGI_FORMAT_BC3_UNORM_SRGB: + return FORMAT_BC3_UNORM_SRGB; + break; + case DXGI_FORMAT_BC4_UNORM: + return FORMAT_BC4_UNORM; + break; + case DXGI_FORMAT_BC4_SNORM: + return FORMAT_BC4_SNORM; + break; + case DXGI_FORMAT_BC5_UNORM: + return FORMAT_BC5_UNORM; + break; + case DXGI_FORMAT_BC5_SNORM: + return FORMAT_BC5_SNORM; + break; + case DXGI_FORMAT_B8G8R8A8_UNORM: + return FORMAT_B8G8R8A8_UNORM; + break; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: + return FORMAT_B8G8R8A8_UNORM_SRGB; + break; + case DXGI_FORMAT_BC6H_UF16: + return FORMAT_BC6H_UF16; + break; + case DXGI_FORMAT_BC6H_SF16: + return FORMAT_BC6H_SF16; + break; + case DXGI_FORMAT_BC7_UNORM: + return FORMAT_BC7_UNORM; + break; + case DXGI_FORMAT_BC7_UNORM_SRGB: + return FORMAT_BC7_UNORM_SRGB; + break; + } return FORMAT_UNKNOWN; - break; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - return FORMAT_R32G32B32A32_FLOAT; - break; - case DXGI_FORMAT_R32G32B32A32_UINT: - return FORMAT_R32G32B32A32_UINT; - break; - case DXGI_FORMAT_R32G32B32A32_SINT: - return FORMAT_R32G32B32A32_SINT; - break; - case DXGI_FORMAT_R32G32B32_FLOAT: - return FORMAT_R32G32B32_FLOAT; - break; - case DXGI_FORMAT_R32G32B32_UINT: - return FORMAT_R32G32B32_UINT; - break; - case DXGI_FORMAT_R32G32B32_SINT: - return FORMAT_R32G32B32_SINT; - break; - case DXGI_FORMAT_R16G16B16A16_FLOAT: - return FORMAT_R16G16B16A16_FLOAT; - break; - case DXGI_FORMAT_R16G16B16A16_UNORM: - return FORMAT_R16G16B16A16_UNORM; - break; - case DXGI_FORMAT_R16G16B16A16_UINT: - return FORMAT_R16G16B16A16_UINT; - break; - case DXGI_FORMAT_R16G16B16A16_SNORM: - return FORMAT_R16G16B16A16_SNORM; - break; - case DXGI_FORMAT_R16G16B16A16_SINT: - return FORMAT_R16G16B16A16_SINT; - break; - case DXGI_FORMAT_R32G32_FLOAT: - return FORMAT_R32G32_FLOAT; - break; - case DXGI_FORMAT_R32G32_UINT: - return FORMAT_R32G32_UINT; - break; - case DXGI_FORMAT_R32G32_SINT: - return FORMAT_R32G32_SINT; - break; - case DXGI_FORMAT_R32G8X24_TYPELESS: - return FORMAT_R32G8X24_TYPELESS; - break; - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: - return FORMAT_D32_FLOAT_S8X24_UINT; - break; - case DXGI_FORMAT_R10G10B10A2_UNORM: - return FORMAT_R10G10B10A2_UNORM; - break; - case DXGI_FORMAT_R10G10B10A2_UINT: - return FORMAT_R10G10B10A2_UINT; - break; - case DXGI_FORMAT_R11G11B10_FLOAT: - return FORMAT_R11G11B10_FLOAT; - break; - case DXGI_FORMAT_R8G8B8A8_UNORM: - return FORMAT_R8G8B8A8_UNORM; - break; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return FORMAT_R8G8B8A8_UNORM_SRGB; - break; - case DXGI_FORMAT_R8G8B8A8_UINT: - return FORMAT_R8G8B8A8_UINT; - break; - case DXGI_FORMAT_R8G8B8A8_SNORM: - return FORMAT_R8G8B8A8_SNORM; - break; - case DXGI_FORMAT_R8G8B8A8_SINT: - return FORMAT_R8G8B8A8_SINT; - break; - case DXGI_FORMAT_R16G16_FLOAT: - return FORMAT_R16G16_FLOAT; - break; - case DXGI_FORMAT_R16G16_UNORM: - return FORMAT_R16G16_UNORM; - break; - case DXGI_FORMAT_R16G16_UINT: - return FORMAT_R16G16_UINT; - break; - case DXGI_FORMAT_R16G16_SNORM: - return FORMAT_R16G16_SNORM; - break; - case DXGI_FORMAT_R16G16_SINT: - return FORMAT_R16G16_SINT; - break; - case DXGI_FORMAT_R32_TYPELESS: - return FORMAT_R32_TYPELESS; - break; - case DXGI_FORMAT_D32_FLOAT: - return FORMAT_D32_FLOAT; - break; - case DXGI_FORMAT_R32_FLOAT: - return FORMAT_R32_FLOAT; - break; - case DXGI_FORMAT_R32_UINT: - return FORMAT_R32_UINT; - break; - case DXGI_FORMAT_R32_SINT: - return FORMAT_R32_SINT; - break; - case DXGI_FORMAT_R24G8_TYPELESS: - return FORMAT_R24G8_TYPELESS; - break; - case DXGI_FORMAT_D24_UNORM_S8_UINT: - return FORMAT_D24_UNORM_S8_UINT; - break; - case DXGI_FORMAT_R8G8_UNORM: - return FORMAT_R8G8_UNORM; - break; - case DXGI_FORMAT_R8G8_UINT: - return FORMAT_R8G8_UINT; - break; - case DXGI_FORMAT_R8G8_SNORM: - return FORMAT_R8G8_SNORM; - break; - case DXGI_FORMAT_R8G8_SINT: - return FORMAT_R8G8_SINT; - break; - case DXGI_FORMAT_R16_TYPELESS: - return FORMAT_R16_TYPELESS; - break; - case DXGI_FORMAT_R16_FLOAT: - return FORMAT_R16_FLOAT; - break; - case DXGI_FORMAT_D16_UNORM: - return FORMAT_D16_UNORM; - break; - case DXGI_FORMAT_R16_UNORM: - return FORMAT_R16_UNORM; - break; - case DXGI_FORMAT_R16_UINT: - return FORMAT_R16_UINT; - break; - case DXGI_FORMAT_R16_SNORM: - return FORMAT_R16_SNORM; - break; - case DXGI_FORMAT_R16_SINT: - return FORMAT_R16_SINT; - break; - case DXGI_FORMAT_R8_UNORM: - return FORMAT_R8_UNORM; - break; - case DXGI_FORMAT_R8_UINT: - return FORMAT_R8_UINT; - break; - case DXGI_FORMAT_R8_SNORM: - return FORMAT_R8_SNORM; - break; - case DXGI_FORMAT_R8_SINT: - return FORMAT_R8_SINT; - break; - case DXGI_FORMAT_BC1_UNORM: - return FORMAT_BC1_UNORM; - break; - case DXGI_FORMAT_BC1_UNORM_SRGB: - return FORMAT_BC1_UNORM_SRGB; - break; - case DXGI_FORMAT_BC2_UNORM: - return FORMAT_BC2_UNORM; - break; - case DXGI_FORMAT_BC2_UNORM_SRGB: - return FORMAT_BC2_UNORM_SRGB; - break; - case DXGI_FORMAT_BC3_UNORM: - return FORMAT_BC3_UNORM; - break; - case DXGI_FORMAT_BC3_UNORM_SRGB: - return FORMAT_BC3_UNORM_SRGB; - break; - case DXGI_FORMAT_BC4_UNORM: - return FORMAT_BC4_UNORM; - break; - case DXGI_FORMAT_BC4_SNORM: - return FORMAT_BC4_SNORM; - break; - case DXGI_FORMAT_BC5_UNORM: - return FORMAT_BC5_UNORM; - break; - case DXGI_FORMAT_BC5_SNORM: - return FORMAT_BC5_SNORM; - break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return FORMAT_B8G8R8A8_UNORM; - break; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return FORMAT_B8G8R8A8_UNORM_SRGB; - break; - case DXGI_FORMAT_BC6H_UF16: - return FORMAT_BC6H_UF16; - break; - case DXGI_FORMAT_BC6H_SF16: - return FORMAT_BC6H_SF16; - break; - case DXGI_FORMAT_BC7_UNORM: - return FORMAT_BC7_UNORM; - break; - case DXGI_FORMAT_BC7_UNORM_SRGB: - return FORMAT_BC7_UNORM_SRGB; - break; } - return FORMAT_UNKNOWN; -} -constexpr USAGE _ConvertUsage_Inv(D3D11_USAGE value) -{ - switch (value) + constexpr USAGE _ConvertUsage_Inv(D3D11_USAGE value) { - case D3D11_USAGE_DEFAULT: + switch (value) + { + case D3D11_USAGE_DEFAULT: + return USAGE_DEFAULT; + break; + case D3D11_USAGE_IMMUTABLE: + return USAGE_IMMUTABLE; + break; + case D3D11_USAGE_DYNAMIC: + return USAGE_DYNAMIC; + break; + case D3D11_USAGE_STAGING: + return USAGE_STAGING; + break; + default: + break; + } return USAGE_DEFAULT; - break; - case D3D11_USAGE_IMMUTABLE: - return USAGE_IMMUTABLE; - break; - case D3D11_USAGE_DYNAMIC: - return USAGE_DYNAMIC; - break; - case D3D11_USAGE_STAGING: - return USAGE_STAGING; - break; - default: - break; } - return USAGE_DEFAULT; + + inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE1D_DESC* pDesc) + { + TextureDesc desc; + desc.Width = pDesc->Width; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); + + return desc; + } + inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE2D_DESC* pDesc) + { + TextureDesc desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.MipLevels = pDesc->MipLevels; + desc.ArraySize = pDesc->ArraySize; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.SampleCount = pDesc->SampleDesc.Count; + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); + + return desc; + } + inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE3D_DESC* pDesc) + { + TextureDesc desc; + desc.Width = pDesc->Width; + desc.Height = pDesc->Height; + desc.Depth = pDesc->Depth; + desc.MipLevels = pDesc->MipLevels; + desc.Format = _ConvertFormat_Inv(pDesc->Format); + desc.Usage = _ConvertUsage_Inv(pDesc->Usage); + desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); + desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); + desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); + + return desc; + } + + + // Local Helpers: + const void* const __nullBlob[128] = {}; // this is initialized to nullptrs and used to unbind resources! + + + // Destroyers: + struct Internal_Buffer + { + std::shared_ptr device; + GPUBuffer* resource = nullptr; + + Internal_Buffer(std::shared_ptr device, GPUBuffer* resource) :device(device), resource(resource) {} + ~Internal_Buffer() + { + device->DestroyBuffer(resource); + device->DestroyResource(resource); + } + }; + struct Internal_Texture + { + std::shared_ptr device; + Texture* resource = nullptr; + + Internal_Texture(std::shared_ptr device, Texture* resource) :device(device), resource(resource) {} + ~Internal_Texture() + { + device->DestroyTexture(resource); + device->DestroyResource(resource); + } + }; + struct Internal_InputLayout + { + std::shared_ptr device; + InputLayout* resource = nullptr; + + Internal_InputLayout(std::shared_ptr device, InputLayout* resource) :device(device), resource(resource) {} + ~Internal_InputLayout() + { + device->DestroyInputLayout(resource); + } + }; + struct Internal_Shader + { + std::shared_ptr device; + Shader* resource = nullptr; + + Internal_Shader(std::shared_ptr device, Shader* resource) :device(device), resource(resource) {} + ~Internal_Shader() + { + device->DestroyShader(resource); + } + }; + struct Internal_BlendState + { + std::shared_ptr device; + BlendState* resource = nullptr; + + Internal_BlendState(std::shared_ptr device, BlendState* resource) :device(device), resource(resource) {} + ~Internal_BlendState() + { + device->DestroyBlendState(resource); + } + }; + struct Internal_DepthStencilState + { + std::shared_ptr device; + DepthStencilState* resource = nullptr; + + Internal_DepthStencilState(std::shared_ptr device, DepthStencilState* resource) :device(device), resource(resource) {} + ~Internal_DepthStencilState() + { + device->DestroyDepthStencilState(resource); + } + }; + struct Internal_RasterizerState + { + std::shared_ptr device; + RasterizerState* resource = nullptr; + + Internal_RasterizerState(std::shared_ptr device, RasterizerState* resource) :device(device), resource(resource) {} + ~Internal_RasterizerState() + { + device->DestroyRasterizerState(resource); + } + }; + struct Internal_Sampler + { + std::shared_ptr device; + Sampler* resource = nullptr; + + Internal_Sampler(std::shared_ptr device, Sampler* resource) :device(device), resource(resource) {} + ~Internal_Sampler() + { + device->DestroySamplerState(resource); + } + }; + struct Internal_Query + { + std::shared_ptr device; + GPUQuery* resource = nullptr; + + Internal_Query(std::shared_ptr device, GPUQuery* resource) :device(device), resource(resource) {} + ~Internal_Query() + { + device->DestroyQuery(resource); + } + }; + struct Internal_PipelineState + { + std::shared_ptr device; + PipelineState* resource = nullptr; + + Internal_PipelineState(std::shared_ptr device, PipelineState* resource) :device(device), resource(resource) {} + ~Internal_PipelineState() + { + device->DestroyPipelineState(resource); + } + }; + struct Internal_RenderPass + { + std::shared_ptr device; + RenderPass* resource = nullptr; + + Internal_RenderPass(std::shared_ptr device, RenderPass* resource) :device(device), resource(resource) {} + ~Internal_RenderPass() + { + device->DestroyRenderPass(resource); + } + }; } - -inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE1D_DESC* pDesc) -{ - TextureDesc desc; - desc.Width = pDesc->Width; - desc.MipLevels = pDesc->MipLevels; - desc.ArraySize = pDesc->ArraySize; - desc.Format = _ConvertFormat_Inv(pDesc->Format); - desc.Usage = _ConvertUsage_Inv(pDesc->Usage); - desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); - - return desc; -} -inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE2D_DESC* pDesc) -{ - TextureDesc desc; - desc.Width = pDesc->Width; - desc.Height = pDesc->Height; - desc.MipLevels = pDesc->MipLevels; - desc.ArraySize = pDesc->ArraySize; - desc.Format = _ConvertFormat_Inv(pDesc->Format); - desc.SampleCount = pDesc->SampleDesc.Count; - desc.Usage = _ConvertUsage_Inv(pDesc->Usage); - desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); - - return desc; -} -inline TextureDesc _ConvertTextureDesc_Inv(const D3D11_TEXTURE3D_DESC* pDesc) -{ - TextureDesc desc; - desc.Width = pDesc->Width; - desc.Height = pDesc->Height; - desc.Depth = pDesc->Depth; - desc.MipLevels = pDesc->MipLevels; - desc.Format = _ConvertFormat_Inv(pDesc->Format); - desc.Usage = _ConvertUsage_Inv(pDesc->Usage); - desc.BindFlags = _ParseBindFlags_Inv(pDesc->BindFlags); - desc.CPUAccessFlags = _ParseCPUAccessFlags_Inv(pDesc->CPUAccessFlags); - desc.MiscFlags = _ParseResourceMiscFlags_Inv(pDesc->MiscFlags); - - return desc; -} - - -// Local Helpers: -const void* const __nullBlob[128] = {}; // this is initialized to nullptrs and used to unbind resources! - +using namespace DX11_Internal; // Engine functions @@ -1292,10 +1422,8 @@ Texture GraphicsDevice_DX11::GetBackBuffer() bool GraphicsDevice_DX11::CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) { - DestroyBuffer(pBuffer); - DestroyResource(pBuffer); + pBuffer->internal_state = std::make_shared(shared_from_this(), pBuffer); pBuffer->type = GPUResource::GPU_RESOURCE_TYPE::BUFFER; - pBuffer->Register(shared_from_this()); D3D11_BUFFER_DESC desc; desc.ByteWidth = pDesc->ByteWidth; @@ -1402,10 +1530,8 @@ bool GraphicsDevice_DX11::CreateBuffer(const GPUBufferDesc *pDesc, const Subreso } bool GraphicsDevice_DX11::CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) { - DestroyTexture(pTexture); - DestroyResource(pTexture); + pTexture->internal_state = std::make_shared(shared_from_this(), pTexture); pTexture->type = GPUResource::GPU_RESOURCE_TYPE::TEXTURE; - pTexture->Register(shared_from_this()); pTexture->desc = *pDesc; @@ -1475,10 +1601,9 @@ bool GraphicsDevice_DX11::CreateTexture(const TextureDesc* pDesc, const Subresou return SUCCEEDED(hr); } -bool GraphicsDevice_DX11::CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) +bool GraphicsDevice_DX11::CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) { - DestroyInputLayout(pInputLayout); - pInputLayout->Register(shared_from_this()); + pInputLayout->internal_state = std::make_shared(shared_from_this(), pInputLayout); pInputLayout->desc.reserve((size_t)NumElements); @@ -1490,7 +1615,7 @@ bool GraphicsDevice_DX11::CreateInputLayout(const VertexLayoutDesc *pInputElemen desc[i].Format = _ConvertFormat(pInputElementDescs[i].Format); desc[i].InputSlot = pInputElementDescs[i].InputSlot; desc[i].AlignedByteOffset = pInputElementDescs[i].AlignedByteOffset; - if (desc[i].AlignedByteOffset == VertexLayoutDesc::APPEND_ALIGNED_ELEMENT) + if (desc[i].AlignedByteOffset == InputLayoutDesc::APPEND_ALIGNED_ELEMENT) desc[i].AlignedByteOffset = D3D11_APPEND_ALIGNED_ELEMENT; desc[i].InputSlotClass = _ConvertInputClassification(pInputElementDescs[i].InputSlotClass); desc[i].InstanceDataStepRate = pInputElementDescs[i].InstanceDataStepRate; @@ -1498,7 +1623,7 @@ bool GraphicsDevice_DX11::CreateInputLayout(const VertexLayoutDesc *pInputElemen pInputLayout->desc.push_back(pInputElementDescs[i]); } - HRESULT hr = device->CreateInputLayout(desc, NumElements, shaderCode->data, shaderCode->size, (ID3D11InputLayout**)&pInputLayout->resource); + HRESULT hr = device->CreateInputLayout(desc, NumElements, shader->code.data(), shader->code.size(), (ID3D11InputLayout**)&pInputLayout->resource); SAFE_DELETE_ARRAY(desc); @@ -1506,12 +1631,10 @@ bool GraphicsDevice_DX11::CreateInputLayout(const VertexLayoutDesc *pInputElemen } bool GraphicsDevice_DX11::CreateShader(SHADERSTAGE stage, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) { - DestroyShader(pShader); - pShader->Register(shared_from_this()); + pShader->internal_state = std::make_shared(shared_from_this(), pShader); - pShader->code.data = new BYTE[BytecodeLength]; - std::memcpy(pShader->code.data, pShaderBytecode, BytecodeLength); - pShader->code.size = BytecodeLength; + pShader->code.resize(BytecodeLength); + std::memcpy(pShader->code.data(), pShaderBytecode, BytecodeLength); pShader->stage = stage; HRESULT hr = E_FAIL; @@ -1544,8 +1667,7 @@ bool GraphicsDevice_DX11::CreateShader(SHADERSTAGE stage, const void *pShaderByt } bool GraphicsDevice_DX11::CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) { - DestroyBlendState(pBlendState); - pBlendState->Register(shared_from_this()); + pBlendState->internal_state = std::make_shared(shared_from_this(), pBlendState); D3D11_BLEND_DESC desc; desc.AlphaToCoverageEnable = pBlendStateDesc->AlphaToCoverageEnable; @@ -1567,8 +1689,7 @@ bool GraphicsDevice_DX11::CreateBlendState(const BlendStateDesc *pBlendStateDesc } bool GraphicsDevice_DX11::CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) { - DestroyDepthStencilState(pDepthStencilState); - pDepthStencilState->Register(shared_from_this()); + pDepthStencilState->internal_state = std::make_shared(shared_from_this(), pDepthStencilState); D3D11_DEPTH_STENCIL_DESC desc; desc.DepthEnable = pDepthStencilStateDesc->DepthEnable; @@ -1591,8 +1712,7 @@ bool GraphicsDevice_DX11::CreateDepthStencilState(const DepthStencilStateDesc *p } bool GraphicsDevice_DX11::CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) { - DestroyRasterizerState(pRasterizerState); - pRasterizerState->Register(shared_from_this()); + pRasterizerState->internal_state = std::make_shared(shared_from_this(), pRasterizerState); pRasterizerState->desc = *pRasterizerStateDesc; @@ -1667,10 +1787,9 @@ bool GraphicsDevice_DX11::CreateRasterizerState(const RasterizerStateDesc *pRast return device->CreateRasterizerState(&desc, (ID3D11RasterizerState**)&pRasterizerState->resource); } -bool GraphicsDevice_DX11::CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) +bool GraphicsDevice_DX11::CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) { - DestroySamplerState(pSamplerState); - pSamplerState->Register(shared_from_this()); + pSamplerState->internal_state = std::make_shared(shared_from_this(), pSamplerState); D3D11_SAMPLER_DESC desc; desc.Filter = _ConvertFilter(pSamplerDesc->Filter); @@ -1692,8 +1811,7 @@ bool GraphicsDevice_DX11::CreateSamplerState(const SamplerDesc *pSamplerDesc, Sa } bool GraphicsDevice_DX11::CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) { - DestroyQuery(pQuery); - pQuery->Register(shared_from_this()); + pQuery->internal_state = std::make_shared(shared_from_this(), pQuery); HRESULT hr = E_FAIL; @@ -1730,8 +1848,7 @@ bool GraphicsDevice_DX11::CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuer } bool GraphicsDevice_DX11::CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) { - DestroyPipelineState(pso); - pso->Register(shared_from_this()); + pso->internal_state = std::make_shared(shared_from_this(), pso); pso->desc = *pDesc; @@ -1739,8 +1856,7 @@ bool GraphicsDevice_DX11::CreatePipelineState(const PipelineStateDesc* pDesc, Pi } bool GraphicsDevice_DX11::CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) { - DestroyRenderPass(renderpass); - renderpass->Register(shared_from_this()); + renderpass->internal_state = std::make_shared(shared_from_this(), renderpass); renderpass->desc = *pDesc; @@ -2206,7 +2322,7 @@ void GraphicsDevice_DX11::DestroyTexture(Texture *pTexture) } pTexture->subresourceDSVs.clear(); } -void GraphicsDevice_DX11::DestroyInputLayout(VertexLayout *pInputLayout) +void GraphicsDevice_DX11::DestroyInputLayout(InputLayout *pInputLayout) { if (pInputLayout->resource != WI_NULL_HANDLE) { diff --git a/WickedEngine/wiGraphicsDevice_DX11.h b/WickedEngine/wiGraphicsDevice_DX11.h index b7e45df37..b0eb79e8d 100644 --- a/WickedEngine/wiGraphicsDevice_DX11.h +++ b/WickedEngine/wiGraphicsDevice_DX11.h @@ -70,12 +70,12 @@ namespace wiGraphics bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) override; bool CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) override; - bool CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) override; + bool CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) override; bool CreateShader(SHADERSTAGE stage, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) override; bool CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) override; bool CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) override; bool CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) override; - bool CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; + bool CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; bool CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) override; bool CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) override; bool CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) override; @@ -85,7 +85,7 @@ namespace wiGraphics void DestroyResource(GPUResource* pResource) override; void DestroyBuffer(GPUBuffer *pBuffer) override; void DestroyTexture(Texture *pTexture) override; - void DestroyInputLayout(VertexLayout *pInputLayout) override; + void DestroyInputLayout(InputLayout *pInputLayout) override; void DestroyShader(Shader *pShader) override; void DestroyBlendState(BlendState *pBlendState) override; void DestroyDepthStencilState(DepthStencilState *pDepthStencilState) override; diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index b2e3f8f05..1b50c0904 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -27,6 +27,9 @@ using namespace std; namespace wiGraphics +{ + +namespace DX12_Internal { // Engine -> Native converters @@ -910,6 +913,134 @@ namespace wiGraphics return ((uLocation + (uAlign - 1)) & ~(uAlign - 1)); } + + // Destroyers: + struct Internal_Buffer + { + std::shared_ptr device; + GPUBuffer* resource = nullptr; + + Internal_Buffer(std::shared_ptr device, GPUBuffer* resource) :device(device), resource(resource) {} + ~Internal_Buffer() + { + device->DestroyBuffer(resource); + device->DestroyResource(resource); + } + }; + struct Internal_Texture + { + std::shared_ptr device; + Texture* resource = nullptr; + + Internal_Texture(std::shared_ptr device, Texture* resource) :device(device), resource(resource) {} + ~Internal_Texture() + { + device->DestroyTexture(resource); + device->DestroyResource(resource); + } + }; + struct Internal_InputLayout + { + std::shared_ptr device; + InputLayout* resource = nullptr; + + Internal_InputLayout(std::shared_ptr device, InputLayout* resource) :device(device), resource(resource) {} + ~Internal_InputLayout() + { + device->DestroyInputLayout(resource); + } + }; + struct Internal_Shader + { + std::shared_ptr device; + Shader* resource = nullptr; + + Internal_Shader(std::shared_ptr device, Shader* resource) :device(device), resource(resource) {} + ~Internal_Shader() + { + device->DestroyShader(resource); + } + }; + struct Internal_BlendState + { + std::shared_ptr device; + BlendState* resource = nullptr; + + Internal_BlendState(std::shared_ptr device, BlendState* resource) :device(device), resource(resource) {} + ~Internal_BlendState() + { + device->DestroyBlendState(resource); + } + }; + struct Internal_DepthStencilState + { + std::shared_ptr device; + DepthStencilState* resource = nullptr; + + Internal_DepthStencilState(std::shared_ptr device, DepthStencilState* resource) :device(device), resource(resource) {} + ~Internal_DepthStencilState() + { + device->DestroyDepthStencilState(resource); + } + }; + struct Internal_RasterizerState + { + std::shared_ptr device; + RasterizerState* resource = nullptr; + + Internal_RasterizerState(std::shared_ptr device, RasterizerState* resource) :device(device), resource(resource) {} + ~Internal_RasterizerState() + { + device->DestroyRasterizerState(resource); + } + }; + struct Internal_Sampler + { + std::shared_ptr device; + Sampler* resource = nullptr; + + Internal_Sampler(std::shared_ptr device, Sampler* resource) :device(device), resource(resource) {} + ~Internal_Sampler() + { + device->DestroySamplerState(resource); + } + }; + struct Internal_Query + { + std::shared_ptr device; + GPUQuery* resource = nullptr; + + Internal_Query(std::shared_ptr device, GPUQuery* resource) :device(device), resource(resource) {} + ~Internal_Query() + { + device->DestroyQuery(resource); + } + }; + struct Internal_PipelineState + { + std::shared_ptr device; + PipelineState* resource = nullptr; + + Internal_PipelineState(std::shared_ptr device, PipelineState* resource) :device(device), resource(resource) {} + ~Internal_PipelineState() + { + device->DestroyPipelineState(resource); + } + }; + struct Internal_RenderPass + { + std::shared_ptr device; + RenderPass* resource = nullptr; + + Internal_RenderPass(std::shared_ptr device, RenderPass* resource) :device(device), resource(resource) {} + ~Internal_RenderPass() + { + device->DestroyRenderPass(resource); + } + }; +} +using namespace DX12_Internal; + // Allocator heaps: GraphicsDevice_DX12::DescriptorAllocator::DescriptorAllocator(ID3D12Device* device, D3D12_DESCRIPTOR_HEAP_TYPE type, uint32_t maxCount) @@ -2003,10 +2134,8 @@ namespace wiGraphics bool GraphicsDevice_DX12::CreateBuffer(const GPUBufferDesc* pDesc, const SubresourceData* pInitialData, GPUBuffer* pBuffer) { - DestroyBuffer(pBuffer); - DestroyResource(pBuffer); + pBuffer->internal_state = std::make_shared(shared_from_this(), pBuffer); pBuffer->type = GPUResource::GPU_RESOURCE_TYPE::BUFFER; - pBuffer->Register(shared_from_this()); HRESULT hr = E_FAIL; @@ -2164,10 +2293,8 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreateTexture(const TextureDesc* pDesc, const SubresourceData* pInitialData, Texture* pTexture) { - DestroyTexture(pTexture); - DestroyResource(pTexture); + pTexture->internal_state = std::make_shared(shared_from_this(), pTexture); pTexture->type = GPUResource::GPU_RESOURCE_TYPE::TEXTURE; - pTexture->Register(shared_from_this()); pTexture->desc = *pDesc; @@ -2330,10 +2457,9 @@ namespace wiGraphics return SUCCEEDED(hr); } - bool GraphicsDevice_DX12::CreateInputLayout(const VertexLayoutDesc* pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout* pInputLayout) + bool GraphicsDevice_DX12::CreateInputLayout(const InputLayoutDesc* pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout* pInputLayout) { - DestroyInputLayout(pInputLayout); - pInputLayout->Register(shared_from_this()); + pInputLayout->internal_state = std::make_shared(shared_from_this(), pInputLayout); pInputLayout->desc.clear(); pInputLayout->desc.reserve((size_t)NumElements); @@ -2346,23 +2472,21 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreateShader(SHADERSTAGE stage, const void* pShaderBytecode, size_t BytecodeLength, Shader* pShader) { - DestroyShader(pShader); - pShader->Register(shared_from_this()); + pShader->internal_state = std::make_shared(shared_from_this(), pShader); - pShader->code.data = new BYTE[BytecodeLength]; - std::memcpy(pShader->code.data, pShaderBytecode, BytecodeLength); - pShader->code.size = BytecodeLength; + pShader->code.resize(BytecodeLength); + std::memcpy(pShader->code.data(), pShaderBytecode, BytecodeLength); pShader->stage = stage; - HRESULT hr = (pShader->code.data != nullptr && pShader->code.size > 0 ? S_OK : E_FAIL); + HRESULT hr = (pShader->code.empty() ? E_FAIL : S_OK); assert(SUCCEEDED(hr)); if (stage == CS) { D3D12_COMPUTE_PIPELINE_STATE_DESC desc = {}; - desc.CS.pShaderBytecode = pShader->code.data; - desc.CS.BytecodeLength = pShader->code.size; + desc.CS.pShaderBytecode = pShader->code.data(); + desc.CS.BytecodeLength = pShader->code.size(); desc.pRootSignature = computeRootSig; hr = device->CreateComputePipelineState(&desc, __uuidof(ID3D12PipelineState), (void**)&pShader->resource); @@ -2373,32 +2497,28 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreateBlendState(const BlendStateDesc* pBlendStateDesc, BlendState* pBlendState) { - DestroyBlendState(pBlendState); - pBlendState->Register(shared_from_this()); + pBlendState->internal_state = std::make_shared(shared_from_this(), pBlendState); pBlendState->desc = *pBlendStateDesc; return S_OK; } bool GraphicsDevice_DX12::CreateDepthStencilState(const DepthStencilStateDesc* pDepthStencilStateDesc, DepthStencilState* pDepthStencilState) { - DestroyDepthStencilState(pDepthStencilState); - pDepthStencilState->Register(shared_from_this()); + pDepthStencilState->internal_state = std::make_shared(shared_from_this(), pDepthStencilState); pDepthStencilState->desc = *pDepthStencilStateDesc; return S_OK; } bool GraphicsDevice_DX12::CreateRasterizerState(const RasterizerStateDesc* pRasterizerStateDesc, RasterizerState* pRasterizerState) { - DestroyRasterizerState(pRasterizerState); - pRasterizerState->Register(shared_from_this()); + pRasterizerState->internal_state = std::make_shared(shared_from_this(), pRasterizerState); pRasterizerState->desc = *pRasterizerStateDesc; return S_OK; } - bool GraphicsDevice_DX12::CreateSamplerState(const SamplerDesc* pSamplerDesc, Sampler* pSamplerState) + bool GraphicsDevice_DX12::CreateSampler(const SamplerDesc* pSamplerDesc, Sampler* pSamplerState) { - DestroySamplerState(pSamplerState); - pSamplerState->Register(shared_from_this()); + pSamplerState->internal_state = std::make_shared(shared_from_this(), pSamplerState); D3D12_SAMPLER_DESC desc; desc.Filter = _ConvertFilter(pSamplerDesc->Filter); @@ -2424,8 +2544,7 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreateQuery(const GPUQueryDesc* pDesc, GPUQuery* pQuery) { - DestroyQuery(pQuery); - pQuery->Register(shared_from_this()); + pQuery->internal_state = std::make_shared(shared_from_this(), pQuery); HRESULT hr = E_FAIL; @@ -2469,8 +2588,7 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) { - DestroyPipelineState(pso); - pso->Register(shared_from_this()); + pso->internal_state = std::make_shared(shared_from_this(), pso); pso->desc = *pDesc; @@ -2491,8 +2609,7 @@ namespace wiGraphics } bool GraphicsDevice_DX12::CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) { - DestroyRenderPass(renderpass); - renderpass->Register(shared_from_this()); + renderpass->internal_state = std::make_shared(shared_from_this(), renderpass); renderpass->desc = *pDesc; @@ -2921,7 +3038,7 @@ namespace wiGraphics } pTexture->subresourceDSVs.clear(); } - void GraphicsDevice_DX12::DestroyInputLayout(VertexLayout* pInputLayout) + void GraphicsDevice_DX12::DestroyInputLayout(InputLayout* pInputLayout) { } @@ -3641,28 +3758,28 @@ namespace wiGraphics if (pso->desc.vs != nullptr) { - desc.VS.pShaderBytecode = pso->desc.vs->code.data; - desc.VS.BytecodeLength = pso->desc.vs->code.size; + desc.VS.pShaderBytecode = pso->desc.vs->code.data(); + desc.VS.BytecodeLength = pso->desc.vs->code.size(); } if (pso->desc.hs != nullptr) { - desc.HS.pShaderBytecode = pso->desc.hs->code.data; - desc.HS.BytecodeLength = pso->desc.hs->code.size; + desc.HS.pShaderBytecode = pso->desc.hs->code.data(); + desc.HS.BytecodeLength = pso->desc.hs->code.size(); } if (pso->desc.ds != nullptr) { - desc.DS.pShaderBytecode = pso->desc.ds->code.data; - desc.DS.BytecodeLength = pso->desc.ds->code.size; + desc.DS.pShaderBytecode = pso->desc.ds->code.data(); + desc.DS.BytecodeLength = pso->desc.ds->code.size(); } if (pso->desc.gs != nullptr) { - desc.GS.pShaderBytecode = pso->desc.gs->code.data; - desc.GS.BytecodeLength = pso->desc.gs->code.size; + desc.GS.pShaderBytecode = pso->desc.gs->code.data(); + desc.GS.BytecodeLength = pso->desc.gs->code.size(); } if (pso->desc.ps != nullptr) { - desc.PS.BytecodeLength = pso->desc.ps->code.size; - desc.PS.pShaderBytecode = pso->desc.ps->code.data; + desc.PS.BytecodeLength = pso->desc.ps->code.size(); + desc.PS.pShaderBytecode = pso->desc.ps->code.data(); } RasterizerStateDesc pRasterizerStateDesc = pso->desc.rs != nullptr ? pso->desc.rs->GetDesc() : RasterizerStateDesc(); @@ -3723,7 +3840,7 @@ namespace wiGraphics elements[i].Format = _ConvertFormat(pso->desc.il->desc[i].Format); elements[i].InputSlot = pso->desc.il->desc[i].InputSlot; elements[i].AlignedByteOffset = pso->desc.il->desc[i].AlignedByteOffset; - if (elements[i].AlignedByteOffset == VertexLayoutDesc::APPEND_ALIGNED_ELEMENT) + if (elements[i].AlignedByteOffset == InputLayoutDesc::APPEND_ALIGNED_ELEMENT) elements[i].AlignedByteOffset = D3D12_APPEND_ALIGNED_ELEMENT; elements[i].InputSlotClass = _ConvertInputClassification(pso->desc.il->desc[i].InputSlotClass); elements[i].InstanceDataStepRate = pso->desc.il->desc[i].InstanceDataStepRate; diff --git a/WickedEngine/wiGraphicsDevice_DX12.h b/WickedEngine/wiGraphicsDevice_DX12.h index 546594a34..f46219b20 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.h +++ b/WickedEngine/wiGraphicsDevice_DX12.h @@ -238,12 +238,12 @@ namespace wiGraphics bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) override; bool CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) override; - bool CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) override; + bool CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) override; bool CreateShader(SHADERSTAGE stage, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) override; bool CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) override; bool CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) override; bool CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) override; - bool CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; + bool CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; bool CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) override; bool CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) override; bool CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) override; @@ -253,7 +253,7 @@ namespace wiGraphics void DestroyResource(GPUResource* pResource) override; void DestroyBuffer(GPUBuffer *pBuffer) override; void DestroyTexture(Texture *pTexture) override; - void DestroyInputLayout(VertexLayout *pInputLayout) override; + void DestroyInputLayout(InputLayout *pInputLayout) override; void DestroyShader(Shader *pShader) override; void DestroyBlendState(BlendState *pBlendState) override; void DestroyDepthStencilState(DepthStencilState *pDepthStencilState) override; diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.cpp b/WickedEngine/wiGraphicsDevice_Vulkan.cpp index d7e36302e..388856a53 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.cpp +++ b/WickedEngine/wiGraphicsDevice_Vulkan.cpp @@ -22,7 +22,8 @@ namespace wiGraphics { - +namespace Vulkan_Internal +{ // Converters: constexpr VkFormat _ConvertFormat(FORMAT value) { @@ -749,6 +750,132 @@ namespace wiGraphics } + // Destroyers: + struct Internal_Buffer + { + std::shared_ptr device; + GPUBuffer* resource = nullptr; + + Internal_Buffer(std::shared_ptr device, GPUBuffer* resource) :device(device), resource(resource) {} + ~Internal_Buffer() + { + device->DestroyBuffer(resource); + device->DestroyResource(resource); + } + }; + struct Internal_Texture + { + std::shared_ptr device; + Texture* resource = nullptr; + + Internal_Texture(std::shared_ptr device, Texture* resource) :device(device), resource(resource) {} + ~Internal_Texture() + { + device->DestroyTexture(resource); + device->DestroyResource(resource); + } + }; + struct Internal_InputLayout + { + std::shared_ptr device; + InputLayout* resource = nullptr; + + Internal_InputLayout(std::shared_ptr device, InputLayout* resource) :device(device), resource(resource) {} + ~Internal_InputLayout() + { + device->DestroyInputLayout(resource); + } + }; + struct Internal_Shader + { + std::shared_ptr device; + Shader* resource = nullptr; + + Internal_Shader(std::shared_ptr device, Shader* resource) :device(device), resource(resource) {} + ~Internal_Shader() + { + device->DestroyShader(resource); + } + }; + struct Internal_BlendState + { + std::shared_ptr device; + BlendState* resource = nullptr; + + Internal_BlendState(std::shared_ptr device, BlendState* resource) :device(device), resource(resource) {} + ~Internal_BlendState() + { + device->DestroyBlendState(resource); + } + }; + struct Internal_DepthStencilState + { + std::shared_ptr device; + DepthStencilState* resource = nullptr; + + Internal_DepthStencilState(std::shared_ptr device, DepthStencilState* resource) :device(device), resource(resource) {} + ~Internal_DepthStencilState() + { + device->DestroyDepthStencilState(resource); + } + }; + struct Internal_RasterizerState + { + std::shared_ptr device; + RasterizerState* resource = nullptr; + + Internal_RasterizerState(std::shared_ptr device, RasterizerState* resource) :device(device), resource(resource) {} + ~Internal_RasterizerState() + { + device->DestroyRasterizerState(resource); + } + }; + struct Internal_Sampler + { + std::shared_ptr device; + Sampler* resource = nullptr; + + Internal_Sampler(std::shared_ptr device, Sampler* resource) :device(device), resource(resource) {} + ~Internal_Sampler() + { + device->DestroySamplerState(resource); + } + }; + struct Internal_Query + { + std::shared_ptr device; + GPUQuery* resource = nullptr; + + Internal_Query(std::shared_ptr device, GPUQuery* resource) :device(device), resource(resource) {} + ~Internal_Query() + { + device->DestroyQuery(resource); + } + }; + struct Internal_PipelineState + { + std::shared_ptr device; + PipelineState* resource = nullptr; + + Internal_PipelineState(std::shared_ptr device, PipelineState* resource) :device(device), resource(resource) {} + ~Internal_PipelineState() + { + device->DestroyPipelineState(resource); + } + }; + struct Internal_RenderPass + { + std::shared_ptr device; + RenderPass* resource = nullptr; + + Internal_RenderPass(std::shared_ptr device, RenderPass* resource) :device(device), resource(resource) {} + ~Internal_RenderPass() + { + device->DestroyRenderPass(resource); + } + }; +} +using namespace Vulkan_Internal; GraphicsDevice_Vulkan::FrameResources::ResourceFrameAllocator::ResourceFrameAllocator(GraphicsDevice_Vulkan* device, size_t size) : device(device) @@ -2266,10 +2393,8 @@ namespace wiGraphics bool GraphicsDevice_Vulkan::CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) { - DestroyBuffer(pBuffer); - DestroyResource(pBuffer); + pBuffer->internal_state = std::make_shared(shared_from_this(), pBuffer); pBuffer->type = GPUResource::GPU_RESOURCE_TYPE::BUFFER; - pBuffer->Register(shared_from_this()); pBuffer->desc = *pDesc; @@ -2452,10 +2577,8 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) { - DestroyTexture(pTexture); - DestroyResource(pTexture); + pTexture->internal_state = std::make_shared(shared_from_this(), pTexture); pTexture->type = GPUResource::GPU_RESOURCE_TYPE::TEXTURE; - pTexture->Register(shared_from_this()); pTexture->desc = *pDesc; @@ -2677,10 +2800,9 @@ namespace wiGraphics return res == VK_SUCCESS ? true : false; } - bool GraphicsDevice_Vulkan::CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) + bool GraphicsDevice_Vulkan::CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) { - DestroyInputLayout(pInputLayout); - pInputLayout->Register(shared_from_this()); + pInputLayout->internal_state = std::make_shared(shared_from_this(), pInputLayout); pInputLayout->desc.clear(); pInputLayout->desc.reserve((size_t)NumElements); @@ -2693,12 +2815,10 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreateShader(SHADERSTAGE stage, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) { - DestroyShader(pShader); - pShader->Register(shared_from_this()); + pShader->internal_state = std::make_shared(shared_from_this(), pShader); - pShader->code.data = new BYTE[BytecodeLength]; - std::memcpy(pShader->code.data, pShaderBytecode, BytecodeLength); - pShader->code.size = BytecodeLength; + pShader->code.resize(BytecodeLength); + std::memcpy(pShader->code.data(), pShaderBytecode, BytecodeLength); pShader->stage = stage; VkResult res = VK_SUCCESS; @@ -2721,8 +2841,8 @@ namespace wiGraphics stageInfo.stage = VK_SHADER_STAGE_COMPUTE_BIT; VkShaderModule shaderModule = {}; - moduleInfo.codeSize = pShader->code.size; - moduleInfo.pCode = reinterpret_cast(pShader->code.data); + moduleInfo.codeSize = pShader->code.size(); + moduleInfo.pCode = reinterpret_cast(pShader->code.data()); res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -2740,32 +2860,28 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) { - DestroyBlendState(pBlendState); - pBlendState->Register(shared_from_this()); + pBlendState->internal_state = std::make_shared(shared_from_this(), pBlendState); pBlendState->desc = *pBlendStateDesc; return true; } bool GraphicsDevice_Vulkan::CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) { - DestroyDepthStencilState(pDepthStencilState); - pDepthStencilState->Register(shared_from_this()); + pDepthStencilState->internal_state = std::make_shared(shared_from_this(), pDepthStencilState); pDepthStencilState->desc = *pDepthStencilStateDesc; return true; } bool GraphicsDevice_Vulkan::CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) { - DestroyRasterizerState(pRasterizerState); - pRasterizerState->Register(shared_from_this()); + pRasterizerState->internal_state = std::make_shared(shared_from_this(), pRasterizerState); pRasterizerState->desc = *pRasterizerStateDesc; return true; } - bool GraphicsDevice_Vulkan::CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) + bool GraphicsDevice_Vulkan::CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) { - DestroySamplerState(pSamplerState); - pSamplerState->Register(shared_from_this()); + pSamplerState->internal_state = std::make_shared(shared_from_this(), pSamplerState); pSamplerState->desc = *pSamplerDesc; @@ -2948,8 +3064,7 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) { - DestroyQuery(pQuery); - pQuery->Register(shared_from_this()); + pQuery->internal_state = std::make_shared(shared_from_this(), pQuery); bool hr = false; @@ -2993,8 +3108,7 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) { - DestroyPipelineState(pso); - pso->Register(shared_from_this()); + pso->internal_state = std::make_shared(shared_from_this(), pso); pso->desc = *pDesc; @@ -3015,8 +3129,7 @@ namespace wiGraphics } bool GraphicsDevice_Vulkan::CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) { - DestroyRenderPass(renderpass); - renderpass->Register(shared_from_this()); + renderpass->internal_state = std::make_shared(shared_from_this(), renderpass); renderpass->desc = *pDesc; @@ -3445,7 +3558,7 @@ namespace wiGraphics } pTexture->subresourceUAVs.clear(); } - void GraphicsDevice_Vulkan::DestroyInputLayout(VertexLayout *pInputLayout) + void GraphicsDevice_Vulkan::DestroyInputLayout(InputLayout *pInputLayout) { } @@ -4137,12 +4250,12 @@ namespace wiGraphics std::vector shaderStages; - if (pso->desc.vs != nullptr && pso->desc.vs->code.data != nullptr) + if (pso->desc.vs != nullptr && !pso->desc.vs->code.empty()) { VkShaderModuleCreateInfo moduleInfo = {}; moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = pso->desc.vs->code.size; - moduleInfo.pCode = reinterpret_cast(pso->desc.vs->code.data); + moduleInfo.codeSize = pso->desc.vs->code.size(); + moduleInfo.pCode = reinterpret_cast(pso->desc.vs->code.data()); VkShaderModule shaderModule; res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -4156,12 +4269,12 @@ namespace wiGraphics shaderStages.push_back(stageInfo); } - if (pso->desc.hs != nullptr && pso->desc.hs->code.data != nullptr) + if (pso->desc.hs != nullptr && !pso->desc.hs->code.empty()) { VkShaderModuleCreateInfo moduleInfo = {}; moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = pso->desc.hs->code.size; - moduleInfo.pCode = reinterpret_cast(pso->desc.hs->code.data); + moduleInfo.codeSize = pso->desc.hs->code.size(); + moduleInfo.pCode = reinterpret_cast(pso->desc.hs->code.data()); VkShaderModule shaderModule; res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -4175,12 +4288,12 @@ namespace wiGraphics shaderStages.push_back(stageInfo); } - if (pso->desc.ds != nullptr && pso->desc.ds->code.data != nullptr) + if (pso->desc.ds != nullptr && !pso->desc.ds->code.empty()) { VkShaderModuleCreateInfo moduleInfo = {}; moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = pso->desc.ds->code.size; - moduleInfo.pCode = reinterpret_cast(pso->desc.ds->code.data); + moduleInfo.codeSize = pso->desc.ds->code.size(); + moduleInfo.pCode = reinterpret_cast(pso->desc.ds->code.data()); VkShaderModule shaderModule; res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -4194,12 +4307,12 @@ namespace wiGraphics shaderStages.push_back(stageInfo); } - if (pso->desc.gs != nullptr && pso->desc.gs->code.data != nullptr) + if (pso->desc.gs != nullptr && !pso->desc.gs->code.empty()) { VkShaderModuleCreateInfo moduleInfo = {}; moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = pso->desc.gs->code.size; - moduleInfo.pCode = reinterpret_cast(pso->desc.gs->code.data); + moduleInfo.codeSize = pso->desc.gs->code.size(); + moduleInfo.pCode = reinterpret_cast(pso->desc.gs->code.data()); VkShaderModule shaderModule; res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -4213,12 +4326,12 @@ namespace wiGraphics shaderStages.push_back(stageInfo); } - if (pso->desc.ps != nullptr && pso->desc.ps->code.data != nullptr) + if (pso->desc.ps != nullptr && !pso->desc.ps->code.empty()) { VkShaderModuleCreateInfo moduleInfo = {}; moduleInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; - moduleInfo.codeSize = pso->desc.ps->code.size; - moduleInfo.pCode = reinterpret_cast(pso->desc.ps->code.data); + moduleInfo.codeSize = pso->desc.ps->code.size(); + moduleInfo.pCode = reinterpret_cast(pso->desc.ps->code.data()); VkShaderModule shaderModule; res = vkCreateShaderModule(device, &moduleInfo, nullptr, &shaderModule); assert(res == VK_SUCCESS); @@ -4252,7 +4365,7 @@ namespace wiGraphics bind.binding = x.InputSlot; bind.inputRate = x.InputSlotClass == INPUT_PER_VERTEX_DATA ? VK_VERTEX_INPUT_RATE_VERTEX : VK_VERTEX_INPUT_RATE_INSTANCE; bind.stride = x.AlignedByteOffset; - if (bind.stride == VertexLayoutDesc::APPEND_ALIGNED_ELEMENT) + if (bind.stride == InputLayoutDesc::APPEND_ALIGNED_ELEMENT) { // need to manually resolve this from the format spec. bind.stride = GetFormatStride(x.Format); @@ -4284,7 +4397,7 @@ namespace wiGraphics attr.format = _ConvertFormat(x.Format); attr.location = i; attr.offset = x.AlignedByteOffset; - if (attr.offset == VertexLayoutDesc::APPEND_ALIGNED_ELEMENT) + if (attr.offset == InputLayoutDesc::APPEND_ALIGNED_ELEMENT) { // need to manually resolve this from the format spec. attr.offset = offset; diff --git a/WickedEngine/wiGraphicsDevice_Vulkan.h b/WickedEngine/wiGraphicsDevice_Vulkan.h index 870f6ee07..46ef3a0fe 100644 --- a/WickedEngine/wiGraphicsDevice_Vulkan.h +++ b/WickedEngine/wiGraphicsDevice_Vulkan.h @@ -270,12 +270,12 @@ namespace wiGraphics bool CreateBuffer(const GPUBufferDesc *pDesc, const SubresourceData* pInitialData, GPUBuffer *pBuffer) override; bool CreateTexture(const TextureDesc* pDesc, const SubresourceData *pInitialData, Texture *pTexture) override; - bool CreateInputLayout(const VertexLayoutDesc *pInputElementDescs, uint32_t NumElements, const ShaderByteCode* shaderCode, VertexLayout *pInputLayout) override; + bool CreateInputLayout(const InputLayoutDesc *pInputElementDescs, uint32_t NumElements, const Shader* shader, InputLayout *pInputLayout) override; bool CreateShader(SHADERSTAGE stafe, const void *pShaderBytecode, size_t BytecodeLength, Shader *pShader) override; bool CreateBlendState(const BlendStateDesc *pBlendStateDesc, BlendState *pBlendState) override; bool CreateDepthStencilState(const DepthStencilStateDesc *pDepthStencilStateDesc, DepthStencilState *pDepthStencilState) override; bool CreateRasterizerState(const RasterizerStateDesc *pRasterizerStateDesc, RasterizerState *pRasterizerState) override; - bool CreateSamplerState(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; + bool CreateSampler(const SamplerDesc *pSamplerDesc, Sampler *pSamplerState) override; bool CreateQuery(const GPUQueryDesc *pDesc, GPUQuery *pQuery) override; bool CreatePipelineState(const PipelineStateDesc* pDesc, PipelineState* pso) override; bool CreateRenderPass(const RenderPassDesc* pDesc, RenderPass* renderpass) override; @@ -285,7 +285,7 @@ namespace wiGraphics void DestroyResource(GPUResource* pResource) override; void DestroyBuffer(GPUBuffer *pBuffer) override; void DestroyTexture(Texture *pTexture) override; - void DestroyInputLayout(VertexLayout *pInputLayout) override; + void DestroyInputLayout(InputLayout *pInputLayout) override; void DestroyShader(Shader *pShader) override; void DestroyBlendState(BlendState *pBlendState) override; void DestroyDepthStencilState(DepthStencilState *pDepthStencilState) override; diff --git a/WickedEngine/wiGraphicsResource.cpp b/WickedEngine/wiGraphicsResource.cpp deleted file mode 100644 index be837d787..000000000 --- a/WickedEngine/wiGraphicsResource.cpp +++ /dev/null @@ -1,102 +0,0 @@ -#include "wiGraphicsResource.h" -#include "wiGraphicsDevice.h" - -namespace wiGraphics -{ - Shader::~Shader() - { - if (device != nullptr) - { - device->DestroyShader(this); - } - } - - Sampler::~Sampler() - { - if (device != nullptr) - { - device->DestroySamplerState(this); - } - } - - GPUResource::~GPUResource() - { - if (device != nullptr) - { - device->DestroyResource(this); - } - } - - GPUBuffer::~GPUBuffer() - { - if (device != nullptr) - { - device->DestroyBuffer(this); - } - } - - VertexLayout::~VertexLayout() - { - if (device != nullptr) - { - device->DestroyInputLayout(this); - } - } - - BlendState::~BlendState() - { - if (device != nullptr) - { - device->DestroyBlendState(this); - } - } - - DepthStencilState::~DepthStencilState() - { - if (device != nullptr) - { - device->DestroyDepthStencilState(this); - } - } - - RasterizerState::~RasterizerState() - { - if (device != nullptr) - { - device->DestroyRasterizerState(this); - } - } - - Texture::~Texture() - { - if (device != nullptr) - { - device->DestroyTexture(this); - } - } - - GPUQuery::~GPUQuery() - { - if (device != nullptr) - { - device->DestroyQuery(this); - } - } - - - PipelineState::~PipelineState() - { - if (device != nullptr) - { - device->DestroyPipelineState(this); - } - } - - RenderPass::~RenderPass() - { - if (device != nullptr) - { - device->DestroyRenderPass(this); - } - } -} diff --git a/WickedEngine/wiGraphicsResource.h b/WickedEngine/wiGraphicsResource.h deleted file mode 100644 index 408e9a69b..000000000 --- a/WickedEngine/wiGraphicsResource.h +++ /dev/null @@ -1,166 +0,0 @@ -#pragma once -#include "CommonInclude.h" -#include "wiGraphicsDescriptors.h" - -#include -#include - -namespace wiGraphics -{ - class GraphicsDevice; - - struct GraphicsDeviceChild - { - std::shared_ptr device; - inline void Register(std::shared_ptr dev) { device = dev; } - inline bool IsValid() const { return device != nullptr; } - }; - - struct ShaderByteCode - { - uint8_t* data = nullptr; - size_t size = 0; - ~ShaderByteCode() { SAFE_DELETE_ARRAY(data); } - }; - - struct Shader : public GraphicsDeviceChild - { - ~Shader(); - - SHADERSTAGE stage = SHADERSTAGE_COUNT; - ShaderByteCode code; - wiCPUHandle resource = WI_NULL_HANDLE; - }; - - struct Sampler : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - SamplerDesc desc; - - ~Sampler(); - - const SamplerDesc& GetDesc() const { return desc; } - }; - - struct GPUResource : public GraphicsDeviceChild - { - enum class GPU_RESOURCE_TYPE - { - BUFFER, - TEXTURE, - UNKNOWN_TYPE, - } type = GPU_RESOURCE_TYPE::UNKNOWN_TYPE; - inline bool IsTexture() const { return type == GPU_RESOURCE_TYPE::TEXTURE; } - inline bool IsBuffer() const { return type == GPU_RESOURCE_TYPE::BUFFER; } - - wiCPUHandle SRV = WI_NULL_HANDLE; - std::vector subresourceSRVs; - - wiCPUHandle UAV = WI_NULL_HANDLE; - std::vector subresourceUAVs; - - wiCPUHandle resource = WI_NULL_HANDLE; - - virtual ~GPUResource(); - }; - - struct GPUBuffer : public GPUResource - { - wiCPUHandle CBV = WI_NULL_HANDLE; - GPUBufferDesc desc; - - virtual ~GPUBuffer(); - - const GPUBufferDesc& GetDesc() const { return desc; } - }; - - struct VertexLayout : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - - std::vector desc; - - ~VertexLayout(); - }; - - struct BlendState : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - BlendStateDesc desc; - - ~BlendState(); - - const BlendStateDesc& GetDesc() const { return desc; } - }; - - struct DepthStencilState : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - DepthStencilStateDesc desc; - - ~DepthStencilState(); - - const DepthStencilStateDesc& GetDesc() const { return desc; } - }; - - struct RasterizerState : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - RasterizerStateDesc desc; - - ~RasterizerState(); - - const RasterizerStateDesc& GetDesc() const { return desc; } - }; - - struct Texture : public GPUResource - { - TextureDesc desc; - wiCPUHandle RTV = WI_NULL_HANDLE; - std::vector subresourceRTVs; - wiCPUHandle DSV = WI_NULL_HANDLE; - std::vector subresourceDSVs; - - ~Texture(); - - const TextureDesc& GetDesc() const { return desc; } - }; - - - - - struct GPUQuery : public GraphicsDeviceChild - { - wiCPUHandle resource = WI_NULL_HANDLE; - GPUQueryDesc desc; - - ~GPUQuery(); - - const GPUQueryDesc& GetDesc() const { return desc; } - }; - - - struct PipelineState : public GraphicsDeviceChild - { - size_t hash = 0; - PipelineStateDesc desc; - - const PipelineStateDesc& GetDesc() const { return desc; } - - ~PipelineState(); - }; - - - struct RenderPass : public GraphicsDeviceChild - { - size_t hash = 0; - wiCPUHandle framebuffer = WI_NULL_HANDLE; - wiCPUHandle renderpass = WI_NULL_HANDLE; - RenderPassDesc desc; - - const RenderPassDesc& GetDesc() const { return desc; } - - ~RenderPass(); - }; - -} diff --git a/WickedEngine/wiNetwork.h b/WickedEngine/wiNetwork.h index 0a3f1ad65..fe9fa4f8f 100644 --- a/WickedEngine/wiNetwork.h +++ b/WickedEngine/wiNetwork.h @@ -1,28 +1,15 @@ #pragma once #include "CommonInclude.h" +#include #include namespace wiNetwork { struct Socket { - wiCPUHandle handle = WI_NULL_HANDLE; - - void operator=(Socket&& other) - { - handle = other.handle; - other.handle = WI_NULL_HANDLE; - } - - Socket() {} - Socket(Socket&& other) - { - handle = other.handle; - - other.handle = WI_NULL_HANDLE; - } - ~Socket(); + std::shared_ptr internal_state; + inline bool IsValid() const { return internal_state.get() != nullptr; } }; static const uint16_t DEFAULT_PORT = 777; diff --git a/WickedEngine/wiNetwork_Windows.cpp b/WickedEngine/wiNetwork_Windows.cpp index bf98aa00a..ddf5e698f 100644 --- a/WickedEngine/wiNetwork_Windows.cpp +++ b/WickedEngine/wiNetwork_Windows.cpp @@ -9,48 +9,60 @@ namespace wiNetwork { - struct wiNetwork_Internal_Cleanup + struct wiNetworkInternal { - bool initialized = false; - ~wiNetwork_Internal_Cleanup() + WSAData wsadata; + + ~wiNetworkInternal() { - if (initialized) + WSACleanup(); + } + }; + std::shared_ptr networkinternal; + + struct SocketInternal + { + std::shared_ptr networkinternal; + SOCKET handle = NULL; + + ~SocketInternal() + { + int result = closesocket(handle); + if (result == SOCKET_ERROR) { - WSACleanup(); + int error = WSAGetLastError(); + assert(0 && error); } } - } cleanup; - - Socket::~Socket() - { - Destroy(this); - } + }; void Initialize() { int result; - WSAData wsadata; - result = WSAStartup(MAKEWORD(2, 2), &wsadata); + + networkinternal = std::make_shared(); + + result = WSAStartup(MAKEWORD(2, 2), &networkinternal->wsadata); if (result) { int error = WSAGetLastError(); std::stringstream ss(""); ss << "wiNetwork Initialization FAILED with error: " << error; wiBackLog::post(ss.str().c_str()); - WSACleanup(); assert(0); } - cleanup.initialized = true; // it will auto cleanup wiBackLog::post("wiNetwork Initialized"); } bool CreateSocket(Socket* sock) { - Destroy(sock); + std::shared_ptr socketinternal = std::make_shared(); + socketinternal->networkinternal = networkinternal; + sock->internal_state = socketinternal; - SOCKET handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (handle == INVALID_SOCKET) + socketinternal->handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if (socketinternal->handle == INVALID_SOCKET) { int error = WSAGetLastError(); std::stringstream ss; @@ -59,33 +71,12 @@ namespace wiNetwork return false; } - sock->handle = (wiCPUHandle)handle; - return true; } - bool Destroy(Socket* sock) - { - if (socket != nullptr && sock->handle != WI_NULL_HANDLE) - { - int result = closesocket((SOCKET)sock->handle); - if (result == SOCKET_ERROR) - { - int error = WSAGetLastError(); - std::stringstream ss; - ss << "wiNetwork error in Destroy: " << error; - wiBackLog::post(ss.str().c_str()); - return false; - } - - sock->handle = WI_NULL_HANDLE; - return true; - } - return false; - } bool Send(const Socket* sock, const Connection* connection, const void* data, size_t dataSize) { - if (socket != nullptr && sock->handle != WI_NULL_HANDLE) + if (socket != nullptr && sock->IsValid()) { sockaddr_in target; target.sin_family = AF_INET; @@ -95,7 +86,9 @@ namespace wiNetwork target.sin_addr.S_un.S_un_b.s_b3 = connection->ipaddress[2]; target.sin_addr.S_un.S_un_b.s_b4 = connection->ipaddress[3]; - int result = sendto((SOCKET)sock->handle, (const char*)data, (int)dataSize, 0, (const sockaddr*)& target, sizeof(target)); + std::shared_ptr socketinternal = std::static_pointer_cast(sock->internal_state); + + int result = sendto(socketinternal->handle, (const char*)data, (int)dataSize, 0, (const sockaddr*)& target, sizeof(target)); if (result == SOCKET_ERROR) { int error = WSAGetLastError(); @@ -112,14 +105,16 @@ namespace wiNetwork bool ListenPort(const Socket* sock, uint16_t port) { - if (socket != nullptr && sock->handle != WI_NULL_HANDLE) + if (socket != nullptr && sock->IsValid()) { sockaddr_in target; target.sin_family = AF_INET; target.sin_port = htons(port); target.sin_addr.S_un.S_addr = htonl(INADDR_ANY); - int result = bind((SOCKET)sock->handle, (const sockaddr*)& target, sizeof(target)); + std::shared_ptr socketinternal = std::static_pointer_cast(sock->internal_state); + + int result = bind(socketinternal->handle, (const sockaddr*)& target, sizeof(target)); if (result == SOCKET_ERROR) { int error = WSAGetLastError(); @@ -136,11 +131,13 @@ namespace wiNetwork bool CanReceive(const Socket* sock, long timeout_microseconds) { - if (socket != nullptr && sock->handle != WI_NULL_HANDLE) + if (socket != nullptr && sock->IsValid()) { + std::shared_ptr socketinternal = std::static_pointer_cast(sock->internal_state); + fd_set readfds; FD_ZERO(&readfds); - FD_SET((SOCKET)sock->handle, &readfds); + FD_SET(socketinternal->handle, &readfds); timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = timeout_microseconds; @@ -154,18 +151,20 @@ namespace wiNetwork return false; } - return FD_ISSET((SOCKET)sock->handle, &readfds); + return FD_ISSET(socketinternal->handle, &readfds); } return false; } bool Receive(const Socket* sock, Connection* connection, void* data, size_t dataSize) { - if (socket != nullptr && sock->handle != WI_NULL_HANDLE) + if (socket != nullptr && sock->IsValid()) { + std::shared_ptr socketinternal = std::static_pointer_cast(sock->internal_state); + sockaddr_in sender; int targetsize = sizeof(sender); - int result = recvfrom((SOCKET)sock->handle, (char*)data, (int)dataSize, 0, (sockaddr*)& sender, &targetsize); + int result = recvfrom(socketinternal->handle, (char*)data, (int)dataSize, 0, (sockaddr*)& sender, &targetsize); if (result == SOCKET_ERROR) { int error = WSAGetLastError(); diff --git a/WickedEngine/wiProfiler.cpp b/WickedEngine/wiProfiler.cpp index 6a6bc287e..46f70df87 100644 --- a/WickedEngine/wiProfiler.cpp +++ b/WickedEngine/wiProfiler.cpp @@ -3,7 +3,6 @@ #include "wiRenderer.h" #include "wiFont.h" #include "wiTimer.h" -#include "wiGraphicsResource.h" #include #include diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 862d6f73a..4a637931b 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -51,7 +51,7 @@ Shader hullShaders[HSTYPE_COUNT]; Shader domainShaders[DSTYPE_COUNT]; Shader computeShaders[CSTYPE_COUNT]; Texture textures[TEXTYPE_COUNT]; -VertexLayout vertexLayouts[VLTYPE_COUNT]; +InputLayout inputLayouts[ILTYPE_COUNT]; RasterizerState rasterizers[RSTYPE_COUNT]; DepthStencilState depthStencils[DSSTYPE_COUNT]; BlendState blendStates[BSTYPE_COUNT]; @@ -408,9 +408,9 @@ const Shader* GetComputeShader(CSTYPES id) { return &computeShaders[id]; } -const VertexLayout* GetVertexLayout(VLTYPES id) +const InputLayout* GetInputLayout(ILTYPES id) { - return &vertexLayouts[id]; + return &inputLayouts[id]; } const RasterizerState* GetRasterizerState(RSTYPES id) { @@ -529,42 +529,42 @@ inline const PipelineState* GetCustomShaderPSO(RENDERPASS renderPass, uint32_t r return nullptr; } -VLTYPES GetVLTYPE(RENDERPASS renderPass, bool tessellation, bool alphatest, bool transparent) +ILTYPES GetILTYPE(RENDERPASS renderPass, bool tessellation, bool alphatest, bool transparent) { - VLTYPES realVL = VLTYPE_OBJECT_POS_TEX; + ILTYPES realVL = ILTYPE_OBJECT_POS_TEX; switch (renderPass) { case RENDERPASS_TEXTURE: if (tessellation) { - realVL = VLTYPE_OBJECT_ALL; + realVL = ILTYPE_OBJECT_ALL; } else { - realVL = VLTYPE_OBJECT_POS_TEX; + realVL = ILTYPE_OBJECT_POS_TEX; } break; case RENDERPASS_DEFERRED: case RENDERPASS_FORWARD: case RENDERPASS_TILEDFORWARD: case RENDERPASS_ENVMAPCAPTURE: - realVL = VLTYPE_OBJECT_ALL; + realVL = ILTYPE_OBJECT_ALL; break; case RENDERPASS_DEPTHONLY: if (tessellation) { - realVL = VLTYPE_OBJECT_ALL; + realVL = ILTYPE_OBJECT_ALL; } else { if (alphatest) { - realVL = VLTYPE_OBJECT_POS_TEX; + realVL = ILTYPE_OBJECT_POS_TEX; } else { - realVL = VLTYPE_OBJECT_POS; + realVL = ILTYPE_OBJECT_POS; } } break; @@ -572,15 +572,15 @@ VLTYPES GetVLTYPE(RENDERPASS renderPass, bool tessellation, bool alphatest, bool case RENDERPASS_SHADOWCUBE: if (alphatest || transparent) { - realVL = VLTYPE_OBJECT_POS_TEX; + realVL = ILTYPE_OBJECT_POS_TEX; } else { - realVL = VLTYPE_OBJECT_POS; + realVL = ILTYPE_OBJECT_POS; } break; case RENDERPASS_VOXELIZE: - realVL = VLTYPE_OBJECT_POS_TEX; + realVL = ILTYPE_OBJECT_POS_TEX; break; } @@ -1042,136 +1042,136 @@ void LoadShaders() wiJobSystem::context ctx; wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, }; LoadShader(VS, vertexShaders[VSTYPE_OBJECT_DEBUG], "objectVS_debug.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_DEBUG].code, &vertexLayouts[VLTYPE_OBJECT_DEBUG]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_DEBUG], &inputLayouts[ILTYPE_OBJECT_DEBUG]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "ATLAS", 0, MeshComponent::Vertex_TEX::FORMAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "COLOR", 0, MeshComponent::Vertex_COL::FORMAT, 4, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "PREVPOS", 0, MeshComponent::Vertex_POS::FORMAT, 5, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "ATLAS", 0, MeshComponent::Vertex_TEX::FORMAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, MeshComponent::Vertex_COL::FORMAT, 4, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "PREVPOS", 0, MeshComponent::Vertex_POS::FORMAT, 5, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIXPREV", 0, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIXPREV", 1, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIXPREV", 2, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEATLAS", 0, FORMAT_R32G32B32A32_FLOAT, 6, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 0, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 1, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 2, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEATLAS", 0, FORMAT_R32G32B32A32_FLOAT, 6, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_OBJECT_COMMON], "objectVS_common.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_COMMON].code, &vertexLayouts[VLTYPE_OBJECT_ALL]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_COMMON], &inputLayouts[ILTYPE_OBJECT_ALL]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_OBJECT_POSITIONSTREAM], "objectVS_positionstream.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_POSITIONSTREAM].code, &vertexLayouts[VLTYPE_OBJECT_POS]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_POSITIONSTREAM], &inputLayouts[ILTYPE_OBJECT_POS]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_OBJECT_SIMPLE], "objectVS_simple.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_SIMPLE].code, &vertexLayouts[VLTYPE_OBJECT_POS_TEX]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_OBJECT_SIMPLE], &inputLayouts[ILTYPE_OBJECT_POS_TEX]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_SHADOW], "shadowVS.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_SHADOW].code, &vertexLayouts[VLTYPE_SHADOW_POS]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_SHADOW], &inputLayouts[ILTYPE_SHADOW_POS]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 0, MeshComponent::Vertex_TEX::FORMAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "UVSET", 1, MeshComponent::Vertex_TEX::FORMAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 3, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 0, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 1, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIX", 2, FORMAT_R32G32B32A32_FLOAT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEUSERDATA", 0, FORMAT_R32G32B32A32_UINT, 3, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_SHADOW_ALPHATEST], "shadowVS_alphatest.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_SHADOW_ALPHATEST].code, &vertexLayouts[VLTYPE_SHADOW_POS_TEX]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_SHADOW_ALPHATEST], &inputLayouts[ILTYPE_SHADOW_POS_TEX]); LoadShader(VS, vertexShaders[VSTYPE_SHADOW_TRANSPARENT], "shadowVS_transparent.cso"); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, FORMAT_R32G32B32A32_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION", 0, FORMAT_R32G32B32A32_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, FORMAT_R32G32B32A32_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, }; LoadShader(VS, vertexShaders[VSTYPE_VERTEXCOLOR], "vertexcolorVS.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_VERTEXCOLOR].code, &vertexLayouts[VLTYPE_VERTEXCOLOR]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_VERTEXCOLOR], &inputLayouts[ILTYPE_VERTEXCOLOR]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION", 0, FORMAT_R32G32B32_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 0, FORMAT_R32G32_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "TEXCOORD", 1, FORMAT_R32G32B32A32_FLOAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION", 0, FORMAT_R32G32B32_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, FORMAT_R32G32_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 1, FORMAT_R32G32B32A32_FLOAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, }; LoadShader(VS, vertexShaders[VSTYPE_TRAIL], "trailVS.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_TRAIL].code, &vertexLayouts[VLTYPE_TRAIL]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_TRAIL], &inputLayouts[ILTYPE_TRAIL]); }); wiJobSystem::Execute(ctx, [device] { - VertexLayoutDesc layout[] = + InputLayoutDesc layout[] = { - { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "ATLAS", 0, MeshComponent::Vertex_TEX::FORMAT, 1, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "POSITION_NORMAL_SUBSETINDEX", 0, MeshComponent::Vertex_POS::FORMAT, 0, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, + { "ATLAS", 0, MeshComponent::Vertex_TEX::FORMAT, 1, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_VERTEX_DATA, 0 }, - { "INSTANCEMATRIXPREV", 0, FORMAT_R32G32B32A32_FLOAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIXPREV", 1, FORMAT_R32G32B32A32_FLOAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, - { "INSTANCEMATRIXPREV", 2, FORMAT_R32G32B32A32_FLOAT, 2, VertexLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 0, FORMAT_R32G32B32A32_FLOAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 1, FORMAT_R32G32B32A32_FLOAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, + { "INSTANCEMATRIXPREV", 2, FORMAT_R32G32B32A32_FLOAT, 2, InputLayoutDesc::APPEND_ALIGNED_ELEMENT, INPUT_PER_INSTANCE_DATA, 1 }, }; LoadShader(VS, vertexShaders[VSTYPE_RENDERLIGHTMAP], "renderlightmapVS.cso"); - device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_RENDERLIGHTMAP].code, &vertexLayouts[VLTYPE_RENDERLIGHTMAP]); + device->CreateInputLayout(layout, arraysize(layout), &vertexShaders[VSTYPE_RENDERLIGHTMAP], &inputLayouts[ILTYPE_RENDERLIGHTMAP]); }); wiJobSystem::Execute(ctx, [] { LoadShader(VS, vertexShaders[VSTYPE_OBJECT_COMMON_TESSELLATION], "objectVS_common_tessellation.cso"); }); @@ -1401,7 +1401,7 @@ void LoadShaders() wiJobSystem::Execute(ctx, [device, renderPass, blendMode, doublesided, tessellation, alphatest, normalmap, planarreflection, pom] { const bool transparency = blendMode != BLENDMODE_OPAQUE; VSTYPES realVS = GetVSTYPE((RENDERPASS)renderPass, tessellation, alphatest, transparency); - VLTYPES realVL = GetVLTYPE((RENDERPASS)renderPass, tessellation, alphatest, transparency); + ILTYPES realVL = GetILTYPE((RENDERPASS)renderPass, tessellation, alphatest, transparency); HSTYPES realHS = GetHSTYPE((RENDERPASS)renderPass, tessellation); DSTYPES realDS = GetDSTYPE((RENDERPASS)renderPass, tessellation); GSTYPES realGS = GetGSTYPE((RENDERPASS)renderPass, alphatest); @@ -1413,7 +1413,7 @@ void LoadShaders() } PipelineStateDesc desc; - desc.il = realVL < VLTYPE_COUNT ? &vertexLayouts[realVL] : nullptr; + desc.il = realVL < ILTYPE_COUNT ? &inputLayouts[realVL] : nullptr; desc.vs = realVS < VSTYPE_COUNT ? &vertexShaders[realVS] : nullptr; desc.hs = realHS < HSTYPE_COUNT ? &hullShaders[realHS] : nullptr; desc.ds = realDS < DSTYPE_COUNT ? &domainShaders[realDS] : nullptr; @@ -1525,11 +1525,11 @@ void LoadShaders() // Hologram sample shader will be registered as custom shader: wiJobSystem::Execute(ctx, [device] { VSTYPES realVS = GetVSTYPE(RENDERPASS_FORWARD, false, false, true); - VLTYPES realVL = GetVLTYPE(RENDERPASS_FORWARD, false, false, true); + ILTYPES realVL = GetILTYPE(RENDERPASS_FORWARD, false, false, true); PipelineStateDesc desc; desc.vs = &vertexShaders[realVS]; - desc.il = &vertexLayouts[realVL]; + desc.il = &inputLayouts[realVL]; desc.ps = &pixelShaders[PSTYPE_OBJECT_HOLOGRAM]; desc.bs = &blendStates[BSTYPE_ADDITIVE]; @@ -1553,7 +1553,7 @@ void LoadShaders() desc.rs = &rasterizers[RSTYPE_DOUBLESIDED]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; desc.dss = &depthStencils[DSSTYPE_DEFAULT]; - desc.il = &vertexLayouts[VLTYPE_OBJECT_POS_TEX]; + desc.il = &inputLayouts[ILTYPE_OBJECT_POS_TEX]; desc.ps = &pixelShaders[PSTYPE_OBJECT_FORWARD_WATER]; device->CreatePipelineState(&desc, &PSO_object_water[RENDERPASS_FORWARD]); @@ -1576,7 +1576,7 @@ void LoadShaders() desc.rs = &rasterizers[RSTYPE_WIRE]; desc.bs = &blendStates[BSTYPE_OPAQUE]; desc.dss = &depthStencils[DSSTYPE_DEFAULT]; - desc.il = &vertexLayouts[VLTYPE_OBJECT_POS_TEX]; + desc.il = &inputLayouts[ILTYPE_OBJECT_POS_TEX]; device->CreatePipelineState(&desc, &PSO_object_wire); }); @@ -1661,7 +1661,7 @@ void LoadShaders() desc.rs = &rasterizers[RSTYPE_FRONT]; desc.bs = &blendStates[BSTYPE_OPAQUE]; desc.dss = &depthStencils[DSSTYPE_CAPTUREIMPOSTOR]; - desc.il = &vertexLayouts[VLTYPE_OBJECT_ALL]; + desc.il = &inputLayouts[ILTYPE_OBJECT_ALL]; desc.ps = &pixelShaders[PSTYPE_CAPTUREIMPOSTOR_ALBEDO]; device->CreatePipelineState(&desc, &PSO_captureimpostor_albedo); @@ -1804,7 +1804,7 @@ void LoadShaders() }); wiJobSystem::Execute(ctx, [device] { PipelineStateDesc desc; - desc.il = &vertexLayouts[VLTYPE_RENDERLIGHTMAP]; + desc.il = &inputLayouts[ILTYPE_RENDERLIGHTMAP]; desc.vs = &vertexShaders[VSTYPE_RENDERLIGHTMAP]; desc.ps = &pixelShaders[PSTYPE_RENDERLIGHTMAP]; desc.rs = &rasterizers[RSTYPE_DOUBLESIDED]; @@ -1917,7 +1917,7 @@ void LoadShaders() case DEBUGRENDERING_GRID: desc.vs = &vertexShaders[VSTYPE_VERTEXCOLOR]; desc.ps = &pixelShaders[PSTYPE_VERTEXCOLOR]; - desc.il = &vertexLayouts[VLTYPE_VERTEXCOLOR]; + desc.il = &inputLayouts[ILTYPE_VERTEXCOLOR]; desc.dss = &depthStencils[DSSTYPE_DEPTHREAD]; desc.rs = &rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; @@ -1926,7 +1926,7 @@ void LoadShaders() case DEBUGRENDERING_CUBE: desc.vs = &vertexShaders[VSTYPE_VERTEXCOLOR]; desc.ps = &pixelShaders[PSTYPE_VERTEXCOLOR]; - desc.il = &vertexLayouts[VLTYPE_VERTEXCOLOR]; + desc.il = &inputLayouts[ILTYPE_VERTEXCOLOR]; desc.dss = &depthStencils[DSSTYPE_DEPTHREAD]; desc.rs = &rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; @@ -1935,7 +1935,7 @@ void LoadShaders() case DEBUGRENDERING_LINES: desc.vs = &vertexShaders[VSTYPE_VERTEXCOLOR]; desc.ps = &pixelShaders[PSTYPE_VERTEXCOLOR]; - desc.il = &vertexLayouts[VLTYPE_VERTEXCOLOR]; + desc.il = &inputLayouts[ILTYPE_VERTEXCOLOR]; desc.dss = &depthStencils[DSSTYPE_XRAY]; desc.rs = &rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; @@ -1944,7 +1944,7 @@ void LoadShaders() case DEBUGRENDERING_TRIANGLE_SOLID: desc.vs = &vertexShaders[VSTYPE_VERTEXCOLOR]; desc.ps = &pixelShaders[PSTYPE_VERTEXCOLOR]; - desc.il = &vertexLayouts[VLTYPE_VERTEXCOLOR]; + desc.il = &inputLayouts[ILTYPE_VERTEXCOLOR]; desc.dss = &depthStencils[DSSTYPE_DEPTHREAD]; desc.rs = &rasterizers[RSTYPE_DOUBLESIDED]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; @@ -1953,7 +1953,7 @@ void LoadShaders() case DEBUGRENDERING_TRIANGLE_WIREFRAME: desc.vs = &vertexShaders[VSTYPE_VERTEXCOLOR]; desc.ps = &pixelShaders[PSTYPE_VERTEXCOLOR]; - desc.il = &vertexLayouts[VLTYPE_VERTEXCOLOR]; + desc.il = &inputLayouts[ILTYPE_VERTEXCOLOR]; desc.dss = &depthStencils[DSSTYPE_DEPTHREAD]; desc.rs = &rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH]; desc.bs = &blendStates[BSTYPE_TRANSPARENT]; @@ -1962,7 +1962,7 @@ void LoadShaders() case DEBUGRENDERING_EMITTER: desc.vs = &vertexShaders[VSTYPE_OBJECT_DEBUG]; desc.ps = &pixelShaders[PSTYPE_OBJECT_DEBUG]; - desc.il = &vertexLayouts[VLTYPE_OBJECT_DEBUG]; + desc.il = &inputLayouts[ILTYPE_OBJECT_DEBUG]; desc.dss = &depthStencils[DSSTYPE_DEPTHREAD]; desc.rs = &rasterizers[RSTYPE_WIRE_DOUBLESIDED_SMOOTH]; desc.bs = &blendStates[BSTYPE_OPAQUE]; @@ -2158,66 +2158,66 @@ void SetUpStates() samplerDesc.BorderColor[3] = 0; samplerDesc.MinLOD = 0; samplerDesc.MaxLOD = FLT_MAX; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_LINEAR_MIRROR]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_LINEAR_MIRROR]); samplerDesc.Filter = FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = TEXTURE_ADDRESS_CLAMP; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_LINEAR_CLAMP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_LINEAR_CLAMP]); samplerDesc.Filter = FILTER_MIN_MAG_MIP_LINEAR; samplerDesc.AddressU = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = TEXTURE_ADDRESS_WRAP; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_LINEAR_WRAP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_LINEAR_WRAP]); samplerDesc.Filter = FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = TEXTURE_ADDRESS_MIRROR; samplerDesc.AddressV = TEXTURE_ADDRESS_MIRROR; samplerDesc.AddressW = TEXTURE_ADDRESS_MIRROR; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_POINT_MIRROR]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_POINT_MIRROR]); samplerDesc.Filter = FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = TEXTURE_ADDRESS_WRAP; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_POINT_WRAP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_POINT_WRAP]); samplerDesc.Filter = FILTER_MIN_MAG_MIP_POINT; samplerDesc.AddressU = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = TEXTURE_ADDRESS_CLAMP; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_POINT_CLAMP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_POINT_CLAMP]); samplerDesc.Filter = FILTER_ANISOTROPIC; samplerDesc.AddressU = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressV = TEXTURE_ADDRESS_CLAMP; samplerDesc.AddressW = TEXTURE_ADDRESS_CLAMP; samplerDesc.MaxAnisotropy = 16; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_ANISO_CLAMP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_ANISO_CLAMP]); samplerDesc.Filter = FILTER_ANISOTROPIC; samplerDesc.AddressU = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = TEXTURE_ADDRESS_WRAP; samplerDesc.MaxAnisotropy = 16; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_ANISO_WRAP]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_ANISO_WRAP]); samplerDesc.Filter = FILTER_ANISOTROPIC; samplerDesc.AddressU = TEXTURE_ADDRESS_MIRROR; samplerDesc.AddressV = TEXTURE_ADDRESS_MIRROR; samplerDesc.AddressW = TEXTURE_ADDRESS_MIRROR; samplerDesc.MaxAnisotropy = 16; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_ANISO_MIRROR]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_ANISO_MIRROR]); samplerDesc.Filter = FILTER_ANISOTROPIC; samplerDesc.AddressU = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressV = TEXTURE_ADDRESS_WRAP; samplerDesc.AddressW = TEXTURE_ADDRESS_WRAP; samplerDesc.MaxAnisotropy = 16; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_OBJECTSHADER]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_OBJECTSHADER]); samplerDesc.Filter = FILTER_COMPARISON_MIN_MAG_LINEAR_MIP_POINT; samplerDesc.AddressU = TEXTURE_ADDRESS_CLAMP; @@ -2226,7 +2226,7 @@ void SetUpStates() samplerDesc.MipLODBias = 0.0f; samplerDesc.MaxAnisotropy = 0; samplerDesc.ComparisonFunc = COMPARISON_GREATER_EQUAL; - device->CreateSamplerState(&samplerDesc, &samplers[SSLOT_CMP_DEPTH]); + device->CreateSampler(&samplerDesc, &samplers[SSLOT_CMP_DEPTH]); @@ -2608,7 +2608,7 @@ void SetUpStates() void ModifySampler(const SamplerDesc& desc, int slot) { - GetDevice()->CreateSamplerState(&desc, &samplers[slot]); + GetDevice()->CreateSampler(&desc, &samplers[slot]); } const std::string& GetShaderPath() @@ -3674,6 +3674,12 @@ void UpdatePerFrameData(float dt, uint32_t layerMask) { continue; } + + const wiHairParticle& hair = scene.hairs[i]; + if (hair.meshID == INVALID_ENTITY || !culling.frustum.CheckBox(hair.aabb)) + { + continue; + } culling.culledHairs.push_back((uint32_t)i); } }); @@ -4190,18 +4196,14 @@ void UpdateRenderData(CommandList cmd) for (uint32_t hairIndex : mainCameraCulling.culledHairs) { const wiHairParticle& hair = scene.hairs[hairIndex]; + const MeshComponent* mesh = scene.meshes.GetComponent(hair.meshID); - if (hair.meshID != INVALID_ENTITY && GetCamera().frustum.CheckBox(hair.aabb)) + if (mesh != nullptr) { - const MeshComponent* mesh = scene.meshes.GetComponent(hair.meshID); + Entity entity = scene.hairs.GetEntity(hairIndex); + const MaterialComponent& material = *scene.materials.GetComponent(entity); - if (mesh != nullptr) - { - Entity entity = scene.hairs.GetEntity(hairIndex); - const MaterialComponent& material = *scene.materials.GetComponent(entity); - - hair.UpdateGPU(*mesh, material, cmd); - } + hair.UpdateGPU(*mesh, material, cmd); } } @@ -5246,21 +5248,17 @@ void DrawScene(const CameraComponent& camera, bool tessellation, CommandList cmd for (uint32_t hairIndex : culling.culledHairs) { const wiHairParticle& hair = scene.hairs[hairIndex]; + Entity entity = scene.hairs.GetEntity(hairIndex); + const MaterialComponent& material = *scene.materials.GetComponent(entity); - if (camera.frustum.CheckBox(hair.aabb)) + if (renderPass == RENDERPASS_FORWARD) { - Entity entity = scene.hairs.GetEntity(hairIndex); - const MaterialComponent& material = *scene.materials.GetComponent(entity); - - if (renderPass == RENDERPASS_FORWARD) - { - ForwardEntityMaskCB cb = ForwardEntityCullingCPU(culling, hair.aabb, renderPass); - device->UpdateBuffer(&constantBuffers[CBTYPE_FORWARDENTITYMASK], &cb, cmd); - device->BindConstantBuffer(PS, &constantBuffers[CBTYPE_FORWARDENTITYMASK], CB_GETBINDSLOT(ForwardEntityMaskCB), cmd); - } - - hair.Draw(camera, material, renderPass, false, cmd); + ForwardEntityMaskCB cb = ForwardEntityCullingCPU(culling, hair.aabb, renderPass); + device->UpdateBuffer(&constantBuffers[CBTYPE_FORWARDENTITYMASK], &cb, cmd); + device->BindConstantBuffer(PS, &constantBuffers[CBTYPE_FORWARDENTITYMASK], CB_GETBINDSLOT(ForwardEntityMaskCB), cmd); } + + hair.Draw(camera, material, renderPass, false, cmd); } } @@ -5338,21 +5336,17 @@ void DrawScene_Transparent(const CameraComponent& camera, const Texture& lineard for (uint32_t hairIndex : culling.culledHairs) { const wiHairParticle& hair = scene.hairs[hairIndex]; + Entity entity = scene.hairs.GetEntity(hairIndex); + const MaterialComponent& material = *scene.materials.GetComponent(entity); - if (camera.frustum.CheckBox(hair.aabb)) + if (renderPass == RENDERPASS_FORWARD) { - Entity entity = scene.hairs.GetEntity(hairIndex); - const MaterialComponent& material = *scene.materials.GetComponent(entity); - - if (renderPass == RENDERPASS_FORWARD) - { - ForwardEntityMaskCB cb = ForwardEntityCullingCPU(culling, hair.aabb, renderPass); - device->UpdateBuffer(&constantBuffers[CBTYPE_FORWARDENTITYMASK], &cb, cmd); - device->BindConstantBuffer(PS, &constantBuffers[CBTYPE_FORWARDENTITYMASK], CB_GETBINDSLOT(ForwardEntityMaskCB), cmd); - } - - hair.Draw(camera, material, renderPass, true, cmd); + ForwardEntityMaskCB cb = ForwardEntityCullingCPU(culling, hair.aabb, renderPass); + device->UpdateBuffer(&constantBuffers[CBTYPE_FORWARDENTITYMASK], &cb, cmd); + device->BindConstantBuffer(PS, &constantBuffers[CBTYPE_FORWARDENTITYMASK], CB_GETBINDSLOT(ForwardEntityMaskCB), cmd); } + + hair.Draw(camera, material, renderPass, true, cmd); } } @@ -5391,10 +5385,8 @@ void DrawDebugWorld(const CameraComponent& camera, CommandList cmd) static GPUBuffer wirecubeVB; static GPUBuffer wirecubeIB; - static bool initialized = false; - if (!initialized) + if (!wirecubeVB.IsValid()) { - XMFLOAT4 min = XMFLOAT4(-1, -1, -1, 1); XMFLOAT4 max = XMFLOAT4(1, 1, 1, 1); diff --git a/WickedEngine/wiRenderer.h b/WickedEngine/wiRenderer.h index c6c847cb4..509887a05 100644 --- a/WickedEngine/wiRenderer.h +++ b/WickedEngine/wiRenderer.h @@ -23,7 +23,7 @@ namespace wiRenderer const wiGraphics::Shader* GetGeometryShader(GSTYPES id); const wiGraphics::Shader* GetPixelShader(PSTYPES id); const wiGraphics::Shader* GetComputeShader(CSTYPES id); - const wiGraphics::VertexLayout* GetVertexLayout(VLTYPES id); + const wiGraphics::InputLayout* GetInputLayout(ILTYPES id); const wiGraphics::RasterizerState* GetRasterizerState(RSTYPES id); const wiGraphics::DepthStencilState* GetDepthStencilState(DSSTYPES id); const wiGraphics::BlendState* GetBlendState(BSTYPES id); diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 3f792920b..e8cf1be9b 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -7,9 +7,9 @@ namespace wiVersion // main engine core const int major = 0; // minor features, major updates - const int minor = 36; + const int minor = 37; // minor bug fixes, alterations, refactors, updates - const int revision = 67; + const int revision = 0; long GetVersion() diff --git a/WickedEngine/wiWidget.cpp b/WickedEngine/wiWidget.cpp index 50941819c..5f3f330d2 100644 --- a/WickedEngine/wiWidget.cpp +++ b/WickedEngine/wiWidget.cpp @@ -210,7 +210,7 @@ void wiWidget::LoadShaders() PipelineStateDesc desc; desc.vs = wiRenderer::GetVertexShader(VSTYPE_VERTEXCOLOR); desc.ps = wiRenderer::GetPixelShader(PSTYPE_VERTEXCOLOR); - desc.il = wiRenderer::GetVertexLayout(VLTYPE_VERTEXCOLOR); + desc.il = wiRenderer::GetInputLayout(ILTYPE_VERTEXCOLOR); desc.dss = wiRenderer::GetDepthStencilState(DSSTYPE_XRAY); desc.bs = wiRenderer::GetBlendState(BSTYPE_TRANSPARENT); desc.rs = wiRenderer::GetRasterizerState(RSTYPE_DOUBLESIDED);