- hook up the software renderer

This commit is contained in:
Magnus Norddahl 2019-02-27 15:37:37 +01:00
parent a3c21e0b01
commit 96547713d9
6 changed files with 95 additions and 16 deletions

View file

@ -41,6 +41,7 @@ public:
void setSize(int width, int height, int miplevels = 1);
void setFormat(VkFormat format);
void setUsage(VkImageUsageFlags imageUsage, VmaMemoryUsage memoryUsage = VMA_MEMORY_USAGE_GPU_ONLY);
void setLinearTiling();
std::unique_ptr<VulkanImage> create(VulkanDevice *device);
@ -331,6 +332,11 @@ inline void ImageBuilder::setFormat(VkFormat format)
imageInfo.format = format;
}
inline void ImageBuilder::setLinearTiling()
{
imageInfo.tiling = VK_IMAGE_TILING_LINEAR;
}
inline void ImageBuilder::setUsage(VkImageUsageFlags usage, VmaMemoryUsage memoryUsage)
{
imageInfo.usage = usage;

View file

@ -37,6 +37,8 @@
#include "hwrenderer/data/shaderuniforms.h"
#include "hwrenderer/dynlights/hw_lightbuffer.h"
#include "swrenderer/r_swscene.h"
#include "vk_framebuffer.h"
#include "vk_buffers.h"
#include "vulkan/renderer/vk_renderstate.h"
@ -119,9 +121,6 @@ void VulkanFrameBuffer::Update()
device->beginFrame();
mPresentCommands = mGraphicsCommandPool->createBuffer();
mPresentCommands->begin();
Draw2D();
Clear2D();
@ -133,7 +132,7 @@ void VulkanFrameBuffer::Update()
PipelineBarrier barrier0;
barrier0.addImage(sceneColor, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
barrier0.execute(mPresentCommands.get(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
barrier0.execute(GetDrawCommands(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VkImageBlit blit = {};
blit.srcOffsets[0] = { 0, 0, 0 };
@ -148,13 +147,13 @@ void VulkanFrameBuffer::Update()
blit.dstSubresource.mipLevel = 0;
blit.dstSubresource.baseArrayLayer = 0;
blit.dstSubresource.layerCount = 1;
mPresentCommands->blitImage(
GetDrawCommands()->blitImage(
sceneColor->image, VK_IMAGE_LAYOUT_GENERAL,
device->swapChain->swapChainImages[device->presentImageIndex], VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
1, &blit, VK_FILTER_NEAREST);
}
mPresentCommands->end();
mDrawCommands->end();
if (mUploadCommands)
{
@ -178,7 +177,7 @@ void VulkanFrameBuffer::Update()
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &mPresentCommands->buffer;
submitInfo.pCommandBuffers = &mDrawCommands->buffer;
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &device->renderFinishedSemaphore->semaphore;
result = vkQueueSubmit(device->graphicsQueue, 1, &submitInfo, device->renderFinishedFence->fence);
@ -196,7 +195,7 @@ void VulkanFrameBuffer::Update()
submitInfo.pWaitSemaphores = waitSemaphores;
submitInfo.pWaitDstStageMask = waitStages;
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &mPresentCommands->buffer;
submitInfo.pCommandBuffers = &mDrawCommands->buffer;
submitInfo.signalSemaphoreCount = 1;
submitInfo.pSignalSemaphores = &device->renderFinishedSemaphore->semaphore;
VkResult result = vkQueueSubmit(device->graphicsQueue, 1, &submitInfo, device->renderFinishedFence->fence);
@ -211,7 +210,7 @@ void VulkanFrameBuffer::Update()
device->presentFrame();
device->waitPresent();
mPresentCommands.reset();
mDrawCommands.reset();
mUploadCommands.reset();
mFrameDeleteList.clear();
@ -228,7 +227,18 @@ void VulkanFrameBuffer::WriteSavePic(player_t *player, FileWriter *file, int wid
sector_t *VulkanFrameBuffer::RenderView(player_t *player)
{
return nullptr;
mRenderState->SetVertexBuffer(screen->mVertexData);
screen->mVertexData->Reset();
if (!V_IsHardwareRenderer())
{
if (!swdrawer) swdrawer.reset(new SWSceneDrawer);
return swdrawer->RenderView(player);
}
else
{
return nullptr;
}
}
uint32_t VulkanFrameBuffer::GetCaps()
@ -337,5 +347,10 @@ VulkanCommandBuffer *VulkanFrameBuffer::GetUploadCommands()
VulkanCommandBuffer *VulkanFrameBuffer::GetDrawCommands()
{
return mPresentCommands.get();
if (!mDrawCommands)
{
mDrawCommands = mGraphicsCommandPool->createBuffer();
mDrawCommands->begin();
}
return mDrawCommands.get();
}

View file

@ -10,6 +10,7 @@ class VkRenderPassManager;
class VkRenderState;
class VKDataBuffer;
class VkHardwareTexture;
class SWSceneDrawer;
class VulkanFrameBuffer : public SystemBaseFrameBuffer
{
@ -34,6 +35,8 @@ public:
std::vector<std::unique_ptr<VulkanBuffer>> mFrameDeleteList;
std::unique_ptr<SWSceneDrawer> swdrawer;
VulkanFrameBuffer(void *hMonitor, bool fullscreen, VulkanDevice *dev);
~VulkanFrameBuffer();
@ -75,7 +78,7 @@ private:
std::unique_ptr<VkRenderPassManager> mRenderPassManager;
std::unique_ptr<VulkanCommandPool> mGraphicsCommandPool;
std::unique_ptr<VulkanCommandBuffer> mUploadCommands;
std::unique_ptr<VulkanCommandBuffer> mPresentCommands;
std::unique_ptr<VulkanCommandBuffer> mDrawCommands;
std::unique_ptr<VulkanSemaphore> mUploadSemaphore;
std::unique_ptr<VkRenderState> mRenderState;

View file

@ -78,6 +78,9 @@ public:
int height = 0;
int mipLevels = 1;
void *Map(size_t offset, size_t size);
void Unmap();
private:
VulkanDevice *device = nullptr;
VmaAllocation allocation;
@ -881,6 +884,18 @@ inline VulkanImage::~VulkanImage()
vmaDestroyImage(device->allocator, image, allocation);
}
inline void *VulkanImage::Map(size_t offset, size_t size)
{
void *data;
VkResult result = vmaMapMemory(device->allocator, allocation, &data);
return (result == VK_SUCCESS) ? data : nullptr;
}
inline void VulkanImage::Unmap()
{
vmaUnmapMemory(device->allocator, allocation);
}
/////////////////////////////////////////////////////////////////////////////
inline VulkanImageView::VulkanImageView(VulkanDevice *device, VkImageView view) : device(device), view(view)

View file

@ -104,7 +104,7 @@ VulkanDescriptorSet *VkHardwareTexture::GetDescriptorSet(const FMaterialState &s
mDescriptorSet = fb->GetRenderPassManager()->DescriptorPool->allocate(fb->GetRenderPassManager()->TextureSetLayout.get());
WriteDescriptors update;
update.addCombinedImageSampler(mDescriptorSet.get(), 0, mImageView.get(), fb->GetSamplerManager()->Get(0), VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
update.addCombinedImageSampler(mDescriptorSet.get(), 0, mImageView.get(), fb->GetSamplerManager()->Get(0), mImageLayout);
update.updateSets(fb->device);
}
@ -207,6 +207,44 @@ int VkHardwareTexture::GetMipLevels(int w, int h)
return levels;
}
void VkHardwareTexture::AllocateBuffer(int w, int h, int texelsize)
{
if (!mImage)
{
auto fb = GetVulkanFrameBuffer();
ImageBuilder imgbuilder;
imgbuilder.setFormat(VK_FORMAT_B8G8R8A8_UNORM);
imgbuilder.setSize(w, h);
imgbuilder.setUsage(VK_IMAGE_USAGE_SAMPLED_BIT, VMA_MEMORY_USAGE_CPU_TO_GPU);
imgbuilder.setLinearTiling();
mImage = imgbuilder.create(fb->device);
mImageLayout = VK_IMAGE_LAYOUT_GENERAL;
mTexelsize = texelsize;
ImageViewBuilder viewbuilder;
viewbuilder.setImage(mImage.get(), texelsize == 4 ? VK_FORMAT_B8G8R8A8_UNORM : VK_FORMAT_R8_UNORM);
mImageView = viewbuilder.create(fb->device);
auto cmdbuffer = fb->GetUploadCommands();
PipelineBarrier imageTransition;
imageTransition.addImage(mImage.get(), VK_IMAGE_LAYOUT_UNDEFINED, mImageLayout, 0, VK_ACCESS_SHADER_READ_BIT);
imageTransition.execute(cmdbuffer, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
}
}
uint8_t *VkHardwareTexture::MapBuffer()
{
return (uint8_t*)mImage->Map(0, mImage->width * mImage->height * mTexelsize);
}
unsigned int VkHardwareTexture::CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name)
{
mImage->Unmap();
return 0;
}
#if 0
//===========================================================================

View file

@ -28,9 +28,9 @@ public:
VulkanDescriptorSet *GetDescriptorSet(const FMaterialState &state);
// Software renderer stuff
void AllocateBuffer(int w, int h, int texelsize) override { }
uint8_t *MapBuffer() override { return nullptr; }
unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name) override { return 0; }
void AllocateBuffer(int w, int h, int texelsize) override;
uint8_t *MapBuffer() override;
unsigned int CreateTexture(unsigned char * buffer, int w, int h, int texunit, bool mipmap, int translation, const char *name) override;
private:
void CreateTexture(int w, int h, int pixelsize, VkFormat format, const void *pixels);
@ -41,6 +41,8 @@ private:
std::unique_ptr<VulkanImage> mImage;
std::unique_ptr<VulkanImageView> mImageView;
std::unique_ptr<VulkanBuffer> mStagingBuffer;
VkImageLayout mImageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
int mTexelsize = 4;
};
#if 0