Refactoring
This commit is contained in:
parent
241583774c
commit
711743ad69
2 changed files with 27 additions and 55 deletions
|
|
@ -195,7 +195,7 @@ void VulkanExample::prepareSparseTexture(uint32_t width, uint32_t height, uint32
|
||||||
texture.device = vulkanDevice->logicalDevice;
|
texture.device = vulkanDevice->logicalDevice;
|
||||||
texture.width = width;
|
texture.width = width;
|
||||||
texture.height = height;
|
texture.height = height;
|
||||||
texture.mipLevels = floor(log2(std::max(width, height))) + 1;
|
texture.mipLevels = static_cast<uint32_t>(floor(log2(std::max(width, height))) + 1);
|
||||||
texture.layerCount = layerCount;
|
texture.layerCount = layerCount;
|
||||||
texture.format = format;
|
texture.format = format;
|
||||||
|
|
||||||
|
|
@ -708,6 +708,28 @@ void VulkanExample::render()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fills a buffer with random colors
|
||||||
|
void VulkanExample::randomPattern(uint8_t* buffer, uint32_t width, uint32_t height)
|
||||||
|
{
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 rndEngine(rd());
|
||||||
|
std::uniform_int_distribution<uint32_t> rndDist(0, 255);
|
||||||
|
uint8_t rndVal[4] = { 0, 0, 0, 0 };
|
||||||
|
while (rndVal[0] + rndVal[1] + rndVal[2] < 10) {
|
||||||
|
rndVal[0] = (uint8_t)rndDist(rndEngine);
|
||||||
|
rndVal[1] = (uint8_t)rndDist(rndEngine);
|
||||||
|
rndVal[2] = (uint8_t)rndDist(rndEngine);
|
||||||
|
}
|
||||||
|
rndVal[3] = 255;
|
||||||
|
for (uint32_t y = 0; y < height; y++) {
|
||||||
|
for (uint32_t x = 0; x < width; x++) {
|
||||||
|
for (uint32_t c = 0; c < 4; c++, ++buffer) {
|
||||||
|
*buffer = rndVal[c];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VulkanExample::uploadContent(VirtualTexturePage page, VkImage image)
|
void VulkanExample::uploadContent(VirtualTexturePage page, VkImage image)
|
||||||
{
|
{
|
||||||
// Generate some random image data and upload as a buffer
|
// Generate some random image data and upload as a buffer
|
||||||
|
|
@ -721,29 +743,8 @@ void VulkanExample::uploadContent(VirtualTexturePage page, VkImage image)
|
||||||
bufferSize));
|
bufferSize));
|
||||||
imageBuffer.map();
|
imageBuffer.map();
|
||||||
|
|
||||||
// Fill buffer with random colors
|
|
||||||
std::random_device rd;
|
|
||||||
std::mt19937 rndEngine(rd());
|
|
||||||
std::uniform_int_distribution<uint32_t> rndDist(0, 255);
|
|
||||||
uint8_t* data = (uint8_t*)imageBuffer.mapped;
|
uint8_t* data = (uint8_t*)imageBuffer.mapped;
|
||||||
uint8_t rndVal[4] = { 0, 0, 0, 0 };
|
randomPattern(data, page.extent.height, page.extent.width);
|
||||||
while (rndVal[0] + rndVal[1] + rndVal[2] < 10) {
|
|
||||||
rndVal[0] = (uint8_t)rndDist(rndEngine);
|
|
||||||
rndVal[1] = (uint8_t)rndDist(rndEngine);
|
|
||||||
rndVal[2] = (uint8_t)rndDist(rndEngine);
|
|
||||||
}
|
|
||||||
rndVal[3] = 255;
|
|
||||||
|
|
||||||
for (uint32_t y = 0; y < page.extent.height; y++)
|
|
||||||
{
|
|
||||||
for (uint32_t x = 0; x < page.extent.width; x++)
|
|
||||||
{
|
|
||||||
for (uint32_t c = 0; c < 4; c++, ++data)
|
|
||||||
{
|
|
||||||
*data = rndVal[c];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
||||||
vks::tools::setImageLayout(copyCmd, image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
vks::tools::setImageLayout(copyCmd, image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
||||||
|
|
@ -821,7 +822,6 @@ void VulkanExample::fillMipTail()
|
||||||
|
|
||||||
const uint32_t width = std::max(texture.width >> i, 1u);
|
const uint32_t width = std::max(texture.width >> i, 1u);
|
||||||
const uint32_t height = std::max(texture.height >> i, 1u);
|
const uint32_t height = std::max(texture.height >> i, 1u);
|
||||||
const uint32_t depth = 1;
|
|
||||||
|
|
||||||
// Generate some random image data and upload as a buffer
|
// Generate some random image data and upload as a buffer
|
||||||
const size_t bufferSize = 4 * width * height;
|
const size_t bufferSize = 4 * width * height;
|
||||||
|
|
@ -839,36 +839,7 @@ void VulkanExample::fillMipTail()
|
||||||
std::mt19937 rndEngine(rd());
|
std::mt19937 rndEngine(rd());
|
||||||
std::uniform_int_distribution<uint32_t> rndDist(0, 255);
|
std::uniform_int_distribution<uint32_t> rndDist(0, 255);
|
||||||
uint8_t* data = (uint8_t*)imageBuffer.mapped;
|
uint8_t* data = (uint8_t*)imageBuffer.mapped;
|
||||||
uint8_t rndVal[4] = { 0, 0, 0, 0 };
|
randomPattern(data, width, height);
|
||||||
while (rndVal[0] + rndVal[1] + rndVal[2] < 10) {
|
|
||||||
rndVal[0] = (uint8_t)rndDist(rndEngine);
|
|
||||||
rndVal[1] = (uint8_t)rndDist(rndEngine);
|
|
||||||
rndVal[2] = (uint8_t)rndDist(rndEngine);
|
|
||||||
}
|
|
||||||
rndVal[3] = 255;
|
|
||||||
|
|
||||||
switch (mipLevel) {
|
|
||||||
case 0:
|
|
||||||
rndVal[0] = rndVal[1] = rndVal[2] = 255;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
rndVal[0] = rndVal[1] = rndVal[2] = 200;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
rndVal[0] = rndVal[1] = rndVal[2] = 150;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (uint32_t y = 0; y < height; y++)
|
|
||||||
{
|
|
||||||
for (uint32_t x = 0; x < width; x++)
|
|
||||||
{
|
|
||||||
for (uint32_t c = 0; c < 4; c++, ++data)
|
|
||||||
{
|
|
||||||
*data = rndVal[c];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
|
||||||
vks::tools::setImageLayout(copyCmd, texture.image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
vks::tools::setImageLayout(copyCmd, texture.image, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
||||||
|
|
@ -877,7 +848,7 @@ void VulkanExample::fillMipTail()
|
||||||
region.imageSubresource.layerCount = 1;
|
region.imageSubresource.layerCount = 1;
|
||||||
region.imageSubresource.mipLevel = i;
|
region.imageSubresource.mipLevel = i;
|
||||||
region.imageOffset = {};
|
region.imageOffset = {};
|
||||||
region.imageExtent = { width, height, depth };
|
region.imageExtent = { width, height, 1 };
|
||||||
vkCmdCopyBufferToImage(copyCmd, imageBuffer.buffer, texture.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
vkCmdCopyBufferToImage(copyCmd, imageBuffer.buffer, texture.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion);
|
||||||
vks::tools::setImageLayout(copyCmd, texture.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
vks::tools::setImageLayout(copyCmd, texture.image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, texture.subRange, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT);
|
||||||
vulkanDevice->flushCommandBuffer(copyCmd, queue);
|
vulkanDevice->flushCommandBuffer(copyCmd, queue);
|
||||||
|
|
|
||||||
|
|
@ -101,6 +101,7 @@ public:
|
||||||
~VulkanExample();
|
~VulkanExample();
|
||||||
virtual void getEnabledFeatures();
|
virtual void getEnabledFeatures();
|
||||||
glm::uvec3 alignedDivision(const VkExtent3D& extent, const VkExtent3D& granularity);
|
glm::uvec3 alignedDivision(const VkExtent3D& extent, const VkExtent3D& granularity);
|
||||||
|
void randomPattern(uint8_t* buffer, uint32_t width, uint32_t height);
|
||||||
void prepareSparseTexture(uint32_t width, uint32_t height, uint32_t layerCount, VkFormat format);
|
void prepareSparseTexture(uint32_t width, uint32_t height, uint32_t layerCount, VkFormat format);
|
||||||
// @todo: move to dtor of texture
|
// @todo: move to dtor of texture
|
||||||
void destroyTextureImage(SparseTexture texture);
|
void destroyTextureImage(SparseTexture texture);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue