/** * Looking Glass * Copyright © 2017-2026 The Looking Glass Authors * https://looking-glass.io * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 2 of the License, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., 59 * Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #pragma once #include "postprocess/CPostProcessor.h" #include #define POST_PROCESS_THREADS_STR "8" namespace PostProcessUtil { static constexpr unsigned Threads = 8; template static constexpr T AlignTo(T value, T align) { return (value + (align - 1)) & ~(align - 1); } bool CreateDefaultTexture(const ComPtr& device, const D3D12_RESOURCE_DESC& desc, ComPtr& resource); bool CreateDefaultBuffer(const ComPtr& device, UINT64 size, ComPtr& resource); HRESULT CreateUploadBuffer(const ComPtr& device, size_t size, ComPtr& resource); HRESULT Upload(const ComPtr& resource, const void * data, size_t size); D3D12_DESCRIPTOR_RANGE Range( D3D12_DESCRIPTOR_RANGE_TYPE type, UINT shaderRegister); static constexpr unsigned Groups(unsigned value) { return (value + (Threads - 1)) / Threads; } } class CComputeEffect : public CPostProcessEffect { protected: ComPtr m_rootSignature; ComPtr m_pso; ComPtr m_descHeap; ComPtr m_dst; unsigned m_threadsX = 0; unsigned m_threadsY = 0; bool InitCompute(const ComPtr& device, const D3D12_DESCRIPTOR_RANGE * ranges, UINT rangeCount, const D3D12_STATIC_SAMPLER_DESC * samplers, UINT samplerCount, const char * shader); void Bind(const ComPtr& commandList); void Dispatch(const ComPtr& commandList); D3D12_CPU_DESCRIPTOR_HANDLE Handle( const ComPtr& device, UINT index) const; void CBV(const ComPtr& device, UINT index, ID3D12Resource * resource, size_t size) const; void SRV(const ComPtr& device, UINT index, ID3D12Resource * resource, DXGI_FORMAT format) const; void UAV(const ComPtr& device, UINT index, ID3D12Resource * resource, DXGI_FORMAT format) const; void TransitionDst(const ComPtr& commandList, D3D12_RESOURCE_STATES before, D3D12_RESOURCE_STATES after); };