renderdoc/driver/d3d11/d3d11_serialise.cpp (731 lines of code) (raw):

/****************************************************************************** * The MIT License (MIT) * * Copyright (c) 2019-2024 Baldur Karlsson * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. ******************************************************************************/ #include "common/common.h" #include "serialise/serialiser.h" #include "d3d11_common.h" #include "d3d11_manager.h" #include "d3d11_resources.h" // serialisation of object handles via IDs. template <class SerialiserType, class Interface> void DoSerialiseViaResourceId(SerialiserType &ser, Interface *&el) { D3D11ResourceManager *rm = (D3D11ResourceManager *)ser.GetUserData(); ResourceId id; if(ser.IsWriting() && rm) id = GetIDForDeviceChild(el); DoSerialise(ser, id); if(ser.IsReading()) { if(id != ResourceId() && rm && rm->HasLiveResource(id)) el = (Interface *)rm->GetLiveResource(id); else el = NULL; } } #undef SERIALISE_INTERFACE #define SERIALISE_INTERFACE(iface) \ template <class SerialiserType> \ void DoSerialise(SerialiserType &ser, iface *&el) \ { \ DoSerialiseViaResourceId(ser, el); \ } \ INSTANTIATE_SERIALISE_TYPE(iface *); SERIALISE_D3D_INTERFACES(); template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BUFFER_DESC &el) { SERIALISE_MEMBER(ByteWidth).Important(); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags).Important(); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); SERIALISE_MEMBER(StructureByteStride); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXTURE1D_DESC &el) { SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXTURE2D_DESC &el) { SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(Height).Important(); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(SampleDesc); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXTURE2D_DESC1 &el) { SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(Height).Important(); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(SampleDesc); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); SERIALISE_MEMBER(TextureLayout); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXTURE3D_DESC &el) { SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(Height).Important(); SERIALISE_MEMBER(Depth).Important(); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXTURE3D_DESC1 &el) { SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(Height).Important(); SERIALISE_MEMBER(Depth).Important(); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(Usage); SERIALISE_MEMBER_TYPED(D3D11_BIND_FLAG, BindFlags); SERIALISE_MEMBER_TYPED(D3D11_CPU_ACCESS_FLAG, CPUAccessFlags); SERIALISE_MEMBER_TYPED(D3D11_RESOURCE_MISC_FLAG, MiscFlags); SERIALISE_MEMBER(TextureLayout); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BUFFER_SRV &el) { SERIALISE_MEMBER(FirstElement).Important(); SERIALISE_MEMBER(NumElements).Important(); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BUFFEREX_SRV &el) { SERIALISE_MEMBER(FirstElement).Important(); SERIALISE_MEMBER(NumElements).Important(); SERIALISE_MEMBER_TYPED(D3D11_BUFFEREX_SRV_FLAG, Flags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_ARRAY_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_SRV1 &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_SRV1 &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX3D_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXCUBE_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEXCUBE_ARRAY_SRV &el) { SERIALISE_MEMBER(MostDetailedMip); SERIALISE_MEMBER(MipLevels); SERIALISE_MEMBER(First2DArrayFace); SERIALISE_MEMBER(NumCubes); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_SRV &el) { } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_ARRAY_SRV &el) { SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_SHADER_RESOURCE_VIEW_DESC &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_SRV_DIMENSION_UNKNOWN: break; case D3D11_SRV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_SRV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_SRV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_SRV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break; case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break; case D3D11_SRV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; case D3D11_SRV_DIMENSION_TEXTURECUBE: SERIALISE_MEMBER(TextureCube); break; case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: SERIALISE_MEMBER(TextureCubeArray); break; case D3D11_SRV_DIMENSION_BUFFEREX: SERIALISE_MEMBER(BufferEx); break; default: RDCERR("Unrecognised SRV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_SHADER_RESOURCE_VIEW_DESC1 &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_SRV_DIMENSION_UNKNOWN: break; case D3D11_SRV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_SRV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_SRV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_SRV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break; case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break; case D3D11_SRV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; case D3D11_SRV_DIMENSION_TEXTURECUBE: SERIALISE_MEMBER(TextureCube); break; case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: SERIALISE_MEMBER(TextureCubeArray); break; case D3D11_SRV_DIMENSION_BUFFEREX: SERIALISE_MEMBER(BufferEx); break; default: RDCERR("Unrecognised SRV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BUFFER_RTV &el) { SERIALISE_MEMBER(FirstElement); SERIALISE_MEMBER(NumElements); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_RTV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_ARRAY_RTV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_RTV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_RTV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_RTV &el) { } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_ARRAY_RTV &el) { SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_RTV1 &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_RTV1 &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX3D_RTV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstWSlice); SERIALISE_MEMBER(WSize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RENDER_TARGET_VIEW_DESC &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_RTV_DIMENSION_UNKNOWN: break; case D3D11_RTV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_RTV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_RTV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_RTV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break; case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break; case D3D11_RTV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; default: RDCERR("Unrecognised RTV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RENDER_TARGET_VIEW_DESC1 &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_RTV_DIMENSION_UNKNOWN: break; case D3D11_RTV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_RTV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_RTV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_RTV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break; case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break; case D3D11_RTV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; default: RDCERR("Unrecognised RTV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BUFFER_UAV &el) { SERIALISE_MEMBER(FirstElement); SERIALISE_MEMBER(NumElements); SERIALISE_MEMBER_TYPED(D3D11_BUFFER_UAV_FLAG, Flags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_UAV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_ARRAY_UAV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_UAV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_UAV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_UAV1 &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_UAV1 &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); SERIALISE_MEMBER(PlaneSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX3D_UAV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstWSlice); SERIALISE_MEMBER(WSize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_UNORDERED_ACCESS_VIEW_DESC &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_UAV_DIMENSION_UNKNOWN: break; case D3D11_UAV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_UAV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_UAV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_UAV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; default: RDCERR("Unrecognised RTV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_UNORDERED_ACCESS_VIEW_DESC1 &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); switch(el.ViewDimension) { case D3D11_UAV_DIMENSION_UNKNOWN: break; case D3D11_UAV_DIMENSION_BUFFER: SERIALISE_MEMBER(Buffer); break; case D3D11_UAV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_UAV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_UAV_DIMENSION_TEXTURE3D: SERIALISE_MEMBER(Texture3D); break; default: RDCERR("Unrecognised UAV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_DSV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX1D_ARRAY_DSV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_DSV &el) { SERIALISE_MEMBER(MipSlice); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2D_ARRAY_DSV &el) { SERIALISE_MEMBER(MipSlice); SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_DSV &el) { } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_TEX2DMS_ARRAY_DSV &el) { SERIALISE_MEMBER(FirstArraySlice); SERIALISE_MEMBER(ArraySize); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_DEPTH_STENCIL_VIEW_DESC &el) { SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(ViewDimension); SERIALISE_MEMBER_TYPED(D3D11_DSV_FLAG, Flags); switch(el.ViewDimension) { case D3D11_DSV_DIMENSION_UNKNOWN: break; case D3D11_DSV_DIMENSION_TEXTURE1D: SERIALISE_MEMBER(Texture1D); break; case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: SERIALISE_MEMBER(Texture1DArray); break; case D3D11_DSV_DIMENSION_TEXTURE2D: SERIALISE_MEMBER(Texture2D); break; case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: SERIALISE_MEMBER(Texture2DArray); break; case D3D11_DSV_DIMENSION_TEXTURE2DMS: SERIALISE_MEMBER(Texture2DMS); break; case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: SERIALISE_MEMBER(Texture2DMSArray); break; default: RDCERR("Unrecognised DSV Dimension %d", el.ViewDimension); break; } } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RENDER_TARGET_BLEND_DESC &el) { SERIALISE_MEMBER_TYPED(bool, BlendEnable); SERIALISE_MEMBER(SrcBlend); SERIALISE_MEMBER(DestBlend); SERIALISE_MEMBER(BlendOp); SERIALISE_MEMBER(SrcBlendAlpha); SERIALISE_MEMBER(DestBlendAlpha); SERIALISE_MEMBER(BlendOpAlpha); SERIALISE_MEMBER_TYPED(D3D11_COLOR_WRITE_ENABLE, RenderTargetWriteMask); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RENDER_TARGET_BLEND_DESC1 &el) { SERIALISE_MEMBER_TYPED(bool, BlendEnable); SERIALISE_MEMBER_TYPED(bool, LogicOpEnable); SERIALISE_MEMBER(SrcBlend); SERIALISE_MEMBER(DestBlend); SERIALISE_MEMBER(BlendOp); SERIALISE_MEMBER(SrcBlendAlpha); SERIALISE_MEMBER(DestBlendAlpha); SERIALISE_MEMBER(BlendOpAlpha); SERIALISE_MEMBER(LogicOp); SERIALISE_MEMBER_TYPED(D3D11_COLOR_WRITE_ENABLE, RenderTargetWriteMask); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BLEND_DESC &el) { SERIALISE_MEMBER_TYPED(bool, AlphaToCoverageEnable); SERIALISE_MEMBER_TYPED(bool, IndependentBlendEnable); // there's no good way to indicate that only the first array element should be important, so we // just omit this entirely SERIALISE_MEMBER(RenderTarget).Unimportant(); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BLEND_DESC1 &el) { SERIALISE_MEMBER_TYPED(bool, AlphaToCoverageEnable); SERIALISE_MEMBER_TYPED(bool, IndependentBlendEnable); SERIALISE_MEMBER(RenderTarget).Unimportant(); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_DEPTH_STENCILOP_DESC &el) { SERIALISE_MEMBER(StencilFailOp); SERIALISE_MEMBER(StencilDepthFailOp); SERIALISE_MEMBER(StencilPassOp); SERIALISE_MEMBER(StencilFunc); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_DEPTH_STENCIL_DESC &el) { SERIALISE_MEMBER_TYPED(bool, DepthEnable); SERIALISE_MEMBER(DepthWriteMask); SERIALISE_MEMBER(DepthFunc).Important(); SERIALISE_MEMBER_TYPED(bool, StencilEnable); SERIALISE_MEMBER(StencilReadMask); SERIALISE_MEMBER(StencilWriteMask); SERIALISE_MEMBER(FrontFace); SERIALISE_MEMBER(BackFace); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RASTERIZER_DESC &el) { SERIALISE_MEMBER(FillMode); SERIALISE_MEMBER(CullMode).Important(); SERIALISE_MEMBER_TYPED(bool, FrontCounterClockwise); SERIALISE_MEMBER(DepthBias); SERIALISE_MEMBER(DepthBiasClamp); SERIALISE_MEMBER(SlopeScaledDepthBias); SERIALISE_MEMBER_TYPED(bool, DepthClipEnable); SERIALISE_MEMBER_TYPED(bool, ScissorEnable); SERIALISE_MEMBER_TYPED(bool, MultisampleEnable); SERIALISE_MEMBER_TYPED(bool, AntialiasedLineEnable); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RASTERIZER_DESC1 &el) { SERIALISE_MEMBER(FillMode); SERIALISE_MEMBER(CullMode).Important(); SERIALISE_MEMBER_TYPED(bool, FrontCounterClockwise); SERIALISE_MEMBER(DepthBias); SERIALISE_MEMBER(DepthBiasClamp); SERIALISE_MEMBER(SlopeScaledDepthBias); SERIALISE_MEMBER_TYPED(bool, DepthClipEnable); SERIALISE_MEMBER_TYPED(bool, ScissorEnable); SERIALISE_MEMBER_TYPED(bool, MultisampleEnable); SERIALISE_MEMBER_TYPED(bool, AntialiasedLineEnable); SERIALISE_MEMBER(ForcedSampleCount); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_RASTERIZER_DESC2 &el) { SERIALISE_MEMBER(FillMode); SERIALISE_MEMBER(CullMode).Important(); SERIALISE_MEMBER_TYPED(bool, FrontCounterClockwise); SERIALISE_MEMBER(DepthBias); SERIALISE_MEMBER(DepthBiasClamp); SERIALISE_MEMBER(SlopeScaledDepthBias); SERIALISE_MEMBER_TYPED(bool, DepthClipEnable); SERIALISE_MEMBER_TYPED(bool, ScissorEnable); SERIALISE_MEMBER_TYPED(bool, MultisampleEnable); SERIALISE_MEMBER_TYPED(bool, AntialiasedLineEnable); SERIALISE_MEMBER(ForcedSampleCount); SERIALISE_MEMBER(ConservativeRaster); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_QUERY_DESC &el) { SERIALISE_MEMBER(Query).Important(); SERIALISE_MEMBER(MiscFlags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_QUERY_DESC1 &el) { SERIALISE_MEMBER(Query).Important(); SERIALISE_MEMBER(MiscFlags); SERIALISE_MEMBER(ContextType); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_COUNTER_DESC &el) { SERIALISE_MEMBER(Counter).Important(); SERIALISE_MEMBER(MiscFlags); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_SAMPLER_DESC &el) { SERIALISE_MEMBER(Filter).Important(); SERIALISE_MEMBER(AddressU); SERIALISE_MEMBER(AddressV); SERIALISE_MEMBER(AddressW); SERIALISE_MEMBER(MipLODBias); SERIALISE_MEMBER(MaxAnisotropy); SERIALISE_MEMBER(ComparisonFunc); SERIALISE_MEMBER(BorderColor); SERIALISE_MEMBER(MinLOD); SERIALISE_MEMBER(MaxLOD); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_SO_DECLARATION_ENTRY &el) { SERIALISE_MEMBER(Stream); SERIALISE_MEMBER(SemanticName); SERIALISE_MEMBER(SemanticIndex); SERIALISE_MEMBER(StartComponent); SERIALISE_MEMBER(ComponentCount); SERIALISE_MEMBER(OutputSlot); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_INPUT_ELEMENT_DESC &el) { SERIALISE_MEMBER(SemanticName).Important(); SERIALISE_MEMBER(SemanticIndex).Important(); SERIALISE_MEMBER(Format).Important(); SERIALISE_MEMBER(InputSlot); SERIALISE_MEMBER(AlignedByteOffset).OffsetOrSize(); SERIALISE_MEMBER(InputSlotClass); SERIALISE_MEMBER(InstanceDataStepRate); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_SUBRESOURCE_DATA &el) { // don't serialise pSysMem, just set it to NULL. See the definition of SERIALISE_MEMBER_DUMMY SERIALISE_MEMBER_ARRAY_EMPTY(pSysMem); SERIALISE_MEMBER(SysMemPitch); SERIALISE_MEMBER(SysMemSlicePitch); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_VIEWPORT &el) { SERIALISE_MEMBER(TopLeftX).Important(); SERIALISE_MEMBER(TopLeftY).Important(); SERIALISE_MEMBER(Width).Important(); SERIALISE_MEMBER(Height).Important(); SERIALISE_MEMBER(MinDepth); SERIALISE_MEMBER(MaxDepth); } template <class SerialiserType> void DoSerialise(SerialiserType &ser, D3D11_BOX &el) { SERIALISE_MEMBER(left); SERIALISE_MEMBER(top); SERIALISE_MEMBER(front); SERIALISE_MEMBER(right); SERIALISE_MEMBER(bottom); SERIALISE_MEMBER(back); } INSTANTIATE_SERIALISE_TYPE(D3D11_BUFFER_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXTURE1D_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXTURE2D_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXTURE2D_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXTURE3D_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXTURE3D_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_BUFFER_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_BUFFEREX_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_ARRAY_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_SRV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_SRV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX3D_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXCUBE_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEXCUBE_ARRAY_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_ARRAY_SRV); INSTANTIATE_SERIALISE_TYPE(D3D11_SHADER_RESOURCE_VIEW_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_SHADER_RESOURCE_VIEW_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_BUFFER_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_ARRAY_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_ARRAY_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_RTV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_RTV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX3D_RTV); INSTANTIATE_SERIALISE_TYPE(D3D11_RENDER_TARGET_VIEW_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_RENDER_TARGET_VIEW_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_BUFFER_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_ARRAY_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_UAV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_UAV1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX3D_UAV); INSTANTIATE_SERIALISE_TYPE(D3D11_UNORDERED_ACCESS_VIEW_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_UNORDERED_ACCESS_VIEW_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX1D_ARRAY_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2D_ARRAY_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_TEX2DMS_ARRAY_DSV); INSTANTIATE_SERIALISE_TYPE(D3D11_DEPTH_STENCIL_VIEW_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_RENDER_TARGET_BLEND_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_RENDER_TARGET_BLEND_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_BLEND_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_BLEND_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_DEPTH_STENCILOP_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_DEPTH_STENCIL_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_RASTERIZER_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_RASTERIZER_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_RASTERIZER_DESC2); INSTANTIATE_SERIALISE_TYPE(D3D11_QUERY_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_QUERY_DESC1); INSTANTIATE_SERIALISE_TYPE(D3D11_COUNTER_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_SAMPLER_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_SO_DECLARATION_ENTRY); INSTANTIATE_SERIALISE_TYPE(D3D11_INPUT_ELEMENT_DESC); INSTANTIATE_SERIALISE_TYPE(D3D11_SUBRESOURCE_DATA); INSTANTIATE_SERIALISE_TYPE(D3D11_VIEWPORT); INSTANTIATE_SERIALISE_TYPE(D3D11_RECT); INSTANTIATE_SERIALISE_TYPE(D3D11_BOX);