No more per-thread vertex and index buffer copy, more objects, random radial distribution (Fixes #168)
This commit is contained in:
parent
87dd4142fb
commit
195dbec797
1 changed files with 17 additions and 60 deletions
|
|
@ -12,6 +12,7 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
#define GLM_FORCE_RADIANS
|
#define GLM_FORCE_RADIANS
|
||||||
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
|
||||||
|
|
@ -94,7 +95,6 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ThreadData {
|
struct ThreadData {
|
||||||
vkMeshLoader::MeshBuffer mesh;
|
|
||||||
VkCommandPool commandPool;
|
VkCommandPool commandPool;
|
||||||
// One command buffer per render object
|
// One command buffer per render object
|
||||||
std::vector<VkCommandBuffer> commandBuffer;
|
std::vector<VkCommandBuffer> commandBuffer;
|
||||||
|
|
@ -138,7 +138,7 @@ public:
|
||||||
|
|
||||||
threadPool.setThreadCount(numThreads);
|
threadPool.setThreadCount(numThreads);
|
||||||
|
|
||||||
numObjectsPerThread = 256 / numThreads;
|
numObjectsPerThread = 512 / numThreads;
|
||||||
}
|
}
|
||||||
|
|
||||||
~VulkanExample()
|
~VulkanExample()
|
||||||
|
|
@ -160,7 +160,6 @@ public:
|
||||||
{
|
{
|
||||||
vkFreeCommandBuffers(device, thread.commandPool, thread.commandBuffer.size(), thread.commandBuffer.data());
|
vkFreeCommandBuffers(device, thread.commandPool, thread.commandBuffer.size(), thread.commandBuffer.data());
|
||||||
vkDestroyCommandPool(device, thread.commandPool, nullptr);
|
vkDestroyCommandPool(device, thread.commandPool, nullptr);
|
||||||
vkMeshLoader::freeMeshBufferResources(device, &thread.mesh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vkDestroyFence(device, renderFence, nullptr);
|
vkDestroyFence(device, renderFence, nullptr);
|
||||||
|
|
@ -196,6 +195,9 @@ public:
|
||||||
uint32_t posX = 0;
|
uint32_t posX = 0;
|
||||||
uint32_t posZ = 0;
|
uint32_t posZ = 0;
|
||||||
|
|
||||||
|
std::mt19937 rndGenerator((unsigned)time(NULL));
|
||||||
|
std::uniform_real_distribution<float> uniformDist(0.0f, 1.0f);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < numThreads; i++)
|
for (uint32_t i = 0; i < numThreads; i++)
|
||||||
{
|
{
|
||||||
ThreadData *thread = &threadData[i];
|
ThreadData *thread = &threadData[i];
|
||||||
|
|
@ -216,61 +218,14 @@ public:
|
||||||
thread->commandBuffer.size());
|
thread->commandBuffer.size());
|
||||||
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &secondaryCmdBufAllocateInfo, thread->commandBuffer.data()));
|
VK_CHECK_RESULT(vkAllocateCommandBuffers(device, &secondaryCmdBufAllocateInfo, thread->commandBuffer.data()));
|
||||||
|
|
||||||
// Unique vertex and index buffers per thread
|
|
||||||
createBuffer(
|
|
||||||
VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
||||||
meshes.ufo.vertices.size,
|
|
||||||
nullptr,
|
|
||||||
&thread->mesh.vertices.buf,
|
|
||||||
&thread->mesh.vertices.mem);
|
|
||||||
createBuffer(
|
|
||||||
VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
|
|
||||||
meshes.ufo.indices.size,
|
|
||||||
nullptr,
|
|
||||||
&thread->mesh.indices.buf,
|
|
||||||
&thread->mesh.indices.mem);
|
|
||||||
|
|
||||||
// Copy from mesh buffer
|
|
||||||
VkBufferCopy copyRegion = {};
|
|
||||||
|
|
||||||
// Vertex buffer
|
|
||||||
copyRegion.size = meshes.ufo.vertices.size;
|
|
||||||
vkCmdCopyBuffer(
|
|
||||||
setupCmdBuffer,
|
|
||||||
meshes.ufo.vertices.buf,
|
|
||||||
thread->mesh.vertices.buf,
|
|
||||||
1,
|
|
||||||
©Region);
|
|
||||||
// Index buffer
|
|
||||||
copyRegion.size = meshes.ufo.indices.size;
|
|
||||||
vkCmdCopyBuffer(
|
|
||||||
setupCmdBuffer,
|
|
||||||
meshes.ufo.indices.buf,
|
|
||||||
thread->mesh.indices.buf,
|
|
||||||
1,
|
|
||||||
©Region);
|
|
||||||
|
|
||||||
// todo : staging
|
|
||||||
|
|
||||||
thread->mesh.indexCount = meshes.ufo.indexCount;
|
|
||||||
|
|
||||||
thread->pushConstBlock.resize(numObjectsPerThread);
|
thread->pushConstBlock.resize(numObjectsPerThread);
|
||||||
thread->objectData.resize(numObjectsPerThread);
|
thread->objectData.resize(numObjectsPerThread);
|
||||||
|
|
||||||
float step = 360.0f / (float)(numThreads * numObjectsPerThread);
|
|
||||||
for (uint32_t j = 0; j < numObjectsPerThread; j++)
|
for (uint32_t j = 0; j < numObjectsPerThread; j++)
|
||||||
{
|
{
|
||||||
float radius = 8.0f + rnd(8.0f) - rnd(4.0f);
|
float theta = 2.0f * float(M_PI) * uniformDist(rndGenerator);
|
||||||
|
float phi = acos(1.0f - 2.0f * uniformDist(rndGenerator));
|
||||||
thread->objectData[j].pos.x = (posX - maxX / 2.0f) * 3.0f + rnd(1.5f) - rnd(1.5f);
|
thread->objectData[j].pos = glm::vec3(sin(phi) * cos(theta), 0.0f, cos(phi)) * 35.0f;
|
||||||
thread->objectData[j].pos.z = (posZ - maxX / 2.0f) * 3.0f + rnd(1.5f) - rnd(1.5f);
|
|
||||||
|
|
||||||
posX += 1.0f;
|
|
||||||
if (posX >= maxX)
|
|
||||||
{
|
|
||||||
posX = 0.0f;
|
|
||||||
posZ += 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
thread->objectData[j].rotation = glm::vec3(0.0f, rnd(360.0f), 0.0f);
|
thread->objectData[j].rotation = glm::vec3(0.0f, rnd(360.0f), 0.0f);
|
||||||
thread->objectData[j].deltaT = rnd(1.0f);
|
thread->objectData[j].deltaT = rnd(1.0f);
|
||||||
|
|
@ -281,10 +236,7 @@ public:
|
||||||
thread->pushConstBlock[j].color = glm::vec3(rnd(1.0f), rnd(1.0f), rnd(1.0f));
|
thread->pushConstBlock[j].color = glm::vec3(rnd(1.0f), rnd(1.0f), rnd(1.0f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submit buffer copies to the queue
|
|
||||||
flushSetupCommandBuffer();
|
|
||||||
// todo : fence?
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Builds the secondary command buffer for each thread
|
// Builds the secondary command buffer for each thread
|
||||||
|
|
@ -347,9 +299,14 @@ public:
|
||||||
&thread->pushConstBlock[cmdBufferIndex]);
|
&thread->pushConstBlock[cmdBufferIndex]);
|
||||||
|
|
||||||
VkDeviceSize offsets[1] = { 0 };
|
VkDeviceSize offsets[1] = { 0 };
|
||||||
vkCmdBindVertexBuffers(cmdBuffer, 0, 1, &thread->mesh.vertices.buf, offsets);
|
//vkCmdBindVertexBuffers(cmdBuffer, 0, 1, &thread->mesh.vertices.buf, offsets);
|
||||||
vkCmdBindIndexBuffer(cmdBuffer, thread->mesh.indices.buf, 0, VK_INDEX_TYPE_UINT32);
|
//vkCmdBindIndexBuffer(cmdBuffer, thread->mesh.indices.buf, 0, VK_INDEX_TYPE_UINT32);
|
||||||
vkCmdDrawIndexed(cmdBuffer, thread->mesh.indexCount, 1, 0, 0, 0);
|
//vkCmdDrawIndexed(cmdBuffer, thread->mesh.indexCount, 1, 0, 0, 0);
|
||||||
|
|
||||||
|
vkCmdBindVertexBuffers(cmdBuffer, 0, 1, &meshes.ufo.vertices.buf, offsets);
|
||||||
|
vkCmdBindIndexBuffer(cmdBuffer, meshes.ufo.indices.buf, 0, VK_INDEX_TYPE_UINT32);
|
||||||
|
vkCmdDrawIndexed(cmdBuffer, meshes.ufo.indexCount, 1, 0, 0, 0);
|
||||||
|
|
||||||
|
|
||||||
VK_CHECK_RESULT(vkEndCommandBuffer(cmdBuffer));
|
VK_CHECK_RESULT(vkEndCommandBuffer(cmdBuffer));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue