Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
Try committed Nov 9, 2021
1 parent b0ab1ee commit 1df37ad
Show file tree
Hide file tree
Showing 8 changed files with 60 additions and 69 deletions.
10 changes: 10 additions & 0 deletions Engine/gapi/abstractgraphicsapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,13 @@ bool AbstractGraphicsApi::Props::hasStorageFormat(TextureFormat f) const {
uint64_t m = uint64_t(1) << uint64_t(f);
return (storFormat&m)!=0;
}

void AbstractGraphicsApi::CommandBuffer::barrier(Texture& tex, ResourceAccess prev, ResourceAccess next, uint32_t mipId) {
AbstractGraphicsApi::BarrierDesc b;
b.texture = &tex;
b.prev = prev;
b.next = next;
b.mip = mipId;
b.discard = (prev==ResourceAccess::None);
barrier(&b,1);
}
1 change: 1 addition & 0 deletions Engine/gapi/abstractgraphicsapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ namespace Tempest {
virtual void endRendering() = 0;

virtual void barrier(const BarrierDesc* desc, size_t cnt) = 0;
virtual void barrier(Texture& tex, ResourceAccess prev, ResourceAccess next, uint32_t mipId);

virtual void generateMipmap(Texture& image, uint32_t texWidth, uint32_t texHeight, uint32_t mipLevels) = 0;
virtual void copy(Buffer& dest, size_t offset, Texture& src, uint32_t width, uint32_t height, uint32_t mip) = 0;
Expand Down
23 changes: 6 additions & 17 deletions Engine/gapi/directx12/dxcommandbuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,25 +215,25 @@ struct DxCommandBuffer::MipMaps : Stage {

impl.IASetVertexBuffers(0,0,nullptr);

const ResourceAccess defLayout = ResourceAccess::Sampler;
if(defLayout!=ResourceAccess::ColorAttach)
cmd.changeLayout(img,defLayout,ResourceAccess::ColorAttach,uint32_t(-1));

D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = rtvHeap->GetCPUDescriptorHandleForHeapStart();
auto rtvHeapInc = dev.device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);

auto& resState = cmd.resState;
resState.setLayout(img,ResourceAccess::TransferDst);
resState.flush(cmd);
for(uint32_t i=1; i<mipLevels; ++i) {
const int mw = (w==1 ? 1 : w/2);
const int mh = (h==1 ? 1 : h/2);

cmd.changeLayout(img,ResourceAccess::ColorAttach,ResourceAccess::Sampler,i-1);
cmd.barrier(img,ResourceAccess::ColorAttach,ResourceAccess::Sampler,i-1);
impl.OMSetRenderTargets(1, &rtvHandle, TRUE, nullptr);
blit(cmd,i-1,mw,mh);

w = mw;
h = mh;
rtvHandle.ptr+= rtvHeapInc;
}
cmd.changeLayout(img, ResourceAccess::ColorAttach, ResourceAccess::Sampler, mipLevels-1);
cmd.barrier(img, ResourceAccess::ColorAttach, ResourceAccess::Sampler, mipLevels-1);
}

DxTexture& img;
Expand Down Expand Up @@ -586,17 +586,6 @@ void DxCommandBuffer::barrier(const AbstractGraphicsApi::BarrierDesc* desc, size
impl->ResourceBarrier(rbCount,rb);
}

void DxCommandBuffer::changeLayout(AbstractGraphicsApi::Texture& t,
ResourceAccess prev, ResourceAccess next, uint32_t mipId) {
AbstractGraphicsApi::BarrierDesc b;
b.texture = &t;
b.prev = prev;
b.next = next;
b.mip = mipId;
b.discard = (prev==ResourceAccess::None);
barrier(&b,1);
}

void DxCommandBuffer::copy(AbstractGraphicsApi::Buffer& dstBuf, size_t offset,
AbstractGraphicsApi::Texture& srcTex, uint32_t width, uint32_t height, uint32_t mip) {
auto& dst = reinterpret_cast<DxBuffer&>(dstBuf);
Expand Down
3 changes: 2 additions & 1 deletion Engine/gapi/directx12/dxcommandbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class DxCommandBuffer:public AbstractGraphicsApi::CommandBuffer {
DxCommandBuffer(DxDevice& d);
~DxCommandBuffer();

using AbstractGraphicsApi::CommandBuffer::barrier;

void begin() override;
void end() override;
void reset() override;
Expand Down Expand Up @@ -60,7 +62,6 @@ class DxCommandBuffer:public AbstractGraphicsApi::CommandBuffer {
void dispatch (size_t x, size_t y, size_t z) override;

void barrier (const AbstractGraphicsApi::BarrierDesc* desc, size_t cnt) override;
void changeLayout(AbstractGraphicsApi::Texture& tex, ResourceAccess prev, ResourceAccess next, uint32_t mipId);

void copy(AbstractGraphicsApi::Buffer& dst, size_t offset, AbstractGraphicsApi::Texture& src, uint32_t width, uint32_t height, uint32_t mip) override;
void generateMipmap(AbstractGraphicsApi::Texture& image, uint32_t texWidth, uint32_t texHeight, uint32_t mipLevels) override;
Expand Down
8 changes: 4 additions & 4 deletions Engine/gapi/directx12api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@ AbstractGraphicsApi::PTexture DirectX12Api::createTexture(Device* d, const Pixma
cmd->hold(pstage); // preserve stage buffer, until gpu side copy is finished

cmd->copy(*pbuf.handler,p.w(),p.h(),0,*pstage.handler,0);
cmd->changeLayout(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
cmd->barrier(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
if(mipCnt>1)
cmd->generateMipmap(*pbuf.handler, p.w(), p.h(), mipCnt);
cmd->end();
Expand Down Expand Up @@ -328,7 +328,7 @@ AbstractGraphicsApi::PTexture DirectX12Api::createCompressedTexture(Device* d, c
h = std::max<uint32_t>(4,h/2);
}

cmd->changeLayout(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
cmd->barrier(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
cmd->end();
dx.dataMgr().submit(std::move(cmd));
return PTexture(pbuf.handler);
Expand Down Expand Up @@ -368,9 +368,9 @@ void DirectX12Api::readPixels(Device* d, Pixmap& out, const PTexture t,

auto cmd = dx.dataMgr().get();
cmd->begin();
cmd->changeLayout(tx,defLay,ResourceAccess::TransferSrc,mip);
cmd->barrier(tx,defLay,ResourceAccess::TransferSrc,mip);
cmd->copyNative(stage,0, tx,w,h,mip);
cmd->changeLayout(tx,ResourceAccess::TransferSrc,defLay,mip);
cmd->barrier(tx,ResourceAccess::TransferSrc,defLay,mip);
cmd->end();
dx.dataMgr().submitAndWait(std::move(cmd));

Expand Down
61 changes: 25 additions & 36 deletions Engine/gapi/vulkan/vcommandbuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,28 @@ static VkImage toVkResource(const AbstractGraphicsApi::BarrierDesc& b) {
return s.images[b.swId];
}

static void fillSubresource(VkImageMemoryBarrier& img, const AbstractGraphicsApi::BarrierDesc& desc) {
VkFormat nativeFormat = VK_FORMAT_UNDEFINED;
if(desc.texture!=nullptr) {
VTexture& t = *reinterpret_cast<VTexture*> (desc.texture);
nativeFormat = t.format;
} else {
VSwapchain& s = *reinterpret_cast<VSwapchain*>(desc.swapchain);
nativeFormat = s.format();
}

img.subresourceRange.baseMipLevel = desc.mip==uint32_t(-1) ? 0 : desc.mip;
img.subresourceRange.levelCount = desc.mip==uint32_t(-1) ? VK_REMAINING_MIP_LEVELS : 1;
img.subresourceRange.baseArrayLayer = 0;
img.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;

if(nativeFormat==VK_FORMAT_D24_UNORM_S8_UINT || nativeFormat==VK_FORMAT_D16_UNORM_S8_UINT || nativeFormat==VK_FORMAT_D32_SFLOAT_S8_UINT)
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; else
if(Detail::nativeIsDepthFormat(nativeFormat))
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; else
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
}


VCommandBuffer::VCommandBuffer(VDevice& device, VkCommandPoolCreateFlags flags)
:device(device), pool(device,flags) {
Expand Down Expand Up @@ -447,17 +469,6 @@ void VCommandBuffer::copy(AbstractGraphicsApi::Buffer& dst, size_t offset,
resState.setLayout(src,ResourceAccess::Sampler); // TODO: storage images
}

void VCommandBuffer::changeLayout(AbstractGraphicsApi::Texture& t,
ResourceAccess prev, ResourceAccess next, uint32_t mipId) {
AbstractGraphicsApi::BarrierDesc b;
b.texture = &t;
b.prev = prev;
b.next = next;
b.mip = mipId;
b.discard = (prev==ResourceAccess::None);
barrier(&b,1);
}

void VCommandBuffer::generateMipmap(AbstractGraphicsApi::Texture& img,
uint32_t texWidth, uint32_t texHeight, uint32_t mipLevels) {
if(mipLevels==1)
Expand All @@ -482,37 +493,15 @@ void VCommandBuffer::generateMipmap(AbstractGraphicsApi::Texture& img,
const int mw = (w==1 ? 1 : w/2);
const int mh = (h==1 ? 1 : h/2);

changeLayout(img,ResourceAccess::TransferDst, ResourceAccess::TransferSrc,i-1);
barrier(img,ResourceAccess::TransferDst, ResourceAccess::TransferSrc,i-1);
blit(img, w, h, i-1,
img, mw,mh, i);

w = mw;
h = mh;
}
changeLayout(img,ResourceAccess::TransferDst, ResourceAccess::TransferSrc, mipLevels-1);
changeLayout(img,ResourceAccess::TransferSrc, ResourceAccess::Sampler, uint32_t(-1));
}

static void fillSubresource(VkImageMemoryBarrier& img, const AbstractGraphicsApi::BarrierDesc& desc) {
VkFormat nativeFormat = VK_FORMAT_UNDEFINED;
if(desc.texture!=nullptr) {
VTexture& t = *reinterpret_cast<VTexture*> (desc.texture);
nativeFormat = t.format;
} else {
VSwapchain& s = *reinterpret_cast<VSwapchain*>(desc.swapchain);
nativeFormat = s.format();
}

img.subresourceRange.baseMipLevel = desc.mip==uint32_t(-1) ? 0 : desc.mip;
img.subresourceRange.levelCount = desc.mip==uint32_t(-1) ? VK_REMAINING_MIP_LEVELS : 1;
img.subresourceRange.baseArrayLayer = 0;
img.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;

if(nativeFormat==VK_FORMAT_D24_UNORM_S8_UINT || nativeFormat==VK_FORMAT_D16_UNORM_S8_UINT || nativeFormat==VK_FORMAT_D32_SFLOAT_S8_UINT)
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; else
if(Detail::nativeIsDepthFormat(nativeFormat))
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; else
img.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
barrier(img,ResourceAccess::TransferDst, ResourceAccess::TransferSrc, mipLevels-1);
barrier(img,ResourceAccess::TransferSrc, ResourceAccess::Sampler, uint32_t(-1));
}

void VCommandBuffer::barrier(const AbstractGraphicsApi::BarrierDesc* desc, size_t cnt) {
Expand Down
10 changes: 5 additions & 5 deletions Engine/gapi/vulkan/vcommandbuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ class VCommandBuffer:public AbstractGraphicsApi::CommandBuffer {
VCommandBuffer(VDevice &device, VkCommandPoolCreateFlags flags=VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
~VCommandBuffer();

VkCommandBuffer impl=nullptr;
std::vector<VSwapchain::Sync*> swapchainSync;
using AbstractGraphicsApi::CommandBuffer::barrier;

void reset() override;

Expand Down Expand Up @@ -65,9 +64,7 @@ class VCommandBuffer:public AbstractGraphicsApi::CommandBuffer {
size_t ioffset, size_t isize, size_t voffset, size_t firstInstance, size_t instanceCount) override;
void dispatch (size_t x, size_t y, size_t z) override;

void barrier (const AbstractGraphicsApi::BarrierDesc* desc, size_t cnt) override;

void changeLayout(AbstractGraphicsApi::Texture& tex, ResourceAccess prev, ResourceAccess next, uint32_t mipId);
void barrier(const AbstractGraphicsApi::BarrierDesc* desc, size_t cnt) override;

void copy(AbstractGraphicsApi::Buffer& dst, size_t offset, AbstractGraphicsApi::Texture& src, uint32_t width, uint32_t height, uint32_t mip) override;
void generateMipmap(AbstractGraphicsApi::Texture& image, uint32_t texWidth, uint32_t texHeight, uint32_t mipLevels) override;
Expand All @@ -81,6 +78,9 @@ class VCommandBuffer:public AbstractGraphicsApi::CommandBuffer {
void blit(AbstractGraphicsApi::Texture& src, uint32_t srcW, uint32_t srcH, uint32_t srcMip,
AbstractGraphicsApi::Texture& dst, uint32_t dstW, uint32_t dstH, uint32_t dstMip);

VkCommandBuffer impl=nullptr;
std::vector<VSwapchain::Sync*> swapchainSync;

private:
void addDependency(VSwapchain& s, size_t imgId);

Expand Down
13 changes: 7 additions & 6 deletions Engine/gapi/vulkanapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,8 @@ AbstractGraphicsApi::PTexture VulkanApi::createTexture(AbstractGraphicsApi::Devi
cmd->hold(pstage);
cmd->hold(pbuf);

cmd->changeLayout(*pbuf.handler, ResourceAccess::None, ResourceAccess::TransferDst, uint32_t(-1));
if(isCompressedFormat(frm)) {
cmd->barrier(*pbuf.handler, ResourceAccess::None, ResourceAccess::TransferDst, uint32_t(-1));
size_t blockSize = Pixmap::blockSizeForFormat(pfrm);
size_t bufferSize = 0;

Expand All @@ -148,10 +148,11 @@ AbstractGraphicsApi::PTexture VulkanApi::createTexture(AbstractGraphicsApi::Devi
h = std::max<uint32_t>(1,h/2);
}

cmd->changeLayout(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
cmd->barrier(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
} else {
cmd->barrier(*pbuf.handler, ResourceAccess::None, ResourceAccess::TransferDst, uint32_t(-1));
cmd->copy(*pbuf.handler,p.w(),p.h(),0,*pstage.handler,0);
cmd->changeLayout(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
cmd->barrier(*pbuf.handler, ResourceAccess::TransferDst, ResourceAccess::Sampler, uint32_t(-1));
if(mipCnt>1)
cmd->generateMipmap(*pbuf.handler, p.w(), p.h(), mipCnt);
}
Expand Down Expand Up @@ -182,7 +183,7 @@ AbstractGraphicsApi::PTexture VulkanApi::createStorage(AbstractGraphicsApi::Devi

auto cmd = dx.dataMgr().get();
cmd->begin();
cmd->changeLayout(*pbuf.handler,ResourceAccess::None,ResourceAccess::Unordered,uint32_t(-1));
cmd->barrier(*pbuf.handler,ResourceAccess::None,ResourceAccess::Unordered,uint32_t(-1));
cmd->end();
dx.dataMgr().submit(std::move(cmd));

Expand All @@ -204,9 +205,9 @@ void VulkanApi::readPixels(AbstractGraphicsApi::Device *d, Pixmap& out, const PT

auto cmd = dx.dataMgr().get();
cmd->begin();
cmd->changeLayout(tx,defLay,ResourceAccess::TransferSrc,uint32_t(-1));
cmd->barrier(tx,defLay,ResourceAccess::TransferSrc,uint32_t(-1));
cmd->copyNative(stage,0, tx,w,h,mip);
cmd->changeLayout(tx,ResourceAccess::TransferSrc,defLay,uint32_t(-1));
cmd->barrier(tx,ResourceAccess::TransferSrc,defLay,uint32_t(-1));
cmd->end();

dx.dataMgr().waitFor(&tx);
Expand Down

0 comments on commit 1df37ad

Please sign in to comment.