#pragma once #include "Bindable.h" template class ConstantBuffer : public Bindable { public: void Update(Graphics& gfx, const C& consts) { D3D11_MAPPED_SUBRESOURCE msr; GetContext(gfx)->Map( pConstantBuffer.Get(), 0u, D3D11_MAP_WRITE_DISCARD, 0u, &msr ); memcpy(msr.pData, &consts, sizeof(consts)); GetContext(gfx)->Unmap(pConstantBuffer.Get(), 0u); } ConstantBuffer(Graphics& gfx, const C& consts) { D3D11_BUFFER_DESC cbd; cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cbd.Usage = D3D11_USAGE_DYNAMIC; cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; cbd.MiscFlags = 0u; cbd.ByteWidth = sizeof(consts); cbd.StructureByteStride = 0u; D3D11_SUBRESOURCE_DATA csd = {}; csd.pSysMem = &consts; GetDevice(gfx)->CreateBuffer(&cbd, &csd, &pConstantBuffer); } ConstantBuffer(Graphics& gfx) { D3D11_BUFFER_DESC cbd; cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cbd.Usage = D3D11_USAGE_DYNAMIC; cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; cbd.MiscFlags = 0u; cbd.ByteWidth = sizeof(C); cbd.StructureByteStride = 0u; GetDevice(gfx)->CreateBuffer(&cbd, nullptr, &pConstantBuffer); } protected: Microsoft::WRL::ComPtr pConstantBuffer; }; template class VertexConstantBuffer : public ConstantBuffer { using ConstantBuffer::pConstantBuffer; using Bindable::GetContext; public: using ConstantBuffer::ConstantBuffer; void Bind(Graphics& gfx, Logger& logger) noexcept override { GetContext(gfx)->VSSetConstantBuffers(0u, 1u, pConstantBuffer.GetAddressOf()); } }; template class PixelConstantBuffer : public ConstantBuffer { using ConstantBuffer::pConstantBuffer; using Bindable::GetContext; public: using ConstantBuffer::ConstantBuffer; void Bind(Graphics& gfx, Logger& logger) noexcept override { GetContext(gfx)->PSSetConstantBuffers(0u, 1u, pConstantBuffer.GetAddressOf()); logger.PutLog("PixelConstantBuffer::Bind", "PSSetConstantBuffers"); } };