Skip to content

Commit 3fae08f

Browse files
committed
GPU Vulkan Display: option to have uniform buffers in device memory with host access
1 parent b91caf9 commit 3fae08f

3 files changed

Lines changed: 18 additions & 11 deletions

File tree

GPU/GPUTracking/Definitions/GPUSettingsList.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ EndConfig()
260260
// Vulkan Display Settings
261261
BeginSubConfig(GPUSettingsDisplayVulkan, vulkan, configStandalone.display, "GLV", 0, "Vulkan display settings", display_vulkan)
262262
AddOption(nFramesInFlight, int, 0, "", 0, "Max number of render frames in flight (0 = as many as swapchain images)")
263+
AddOption(uniformBuffersInDeviceMemory, bool, 1, "", 0, "Have uniform buffers in host-accessible device memory")
263264
AddHelp("help", 'h')
264265
EndConfig()
265266

GPU/GPUTracking/display/GPUDisplayBackendVulkan.cxx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -554,8 +554,8 @@ void GPUDisplayBackendVulkan::createUniformLayoutsAndBuffers()
554554
mUniformBuffersMat[j].resize(mFramesInFlight);
555555
mUniformBuffersCol[j].resize(mFramesInFlight);
556556
for (unsigned int i = 0; i < mFramesInFlight; i++) {
557-
mUniformBuffersMat[j][i] = createBuffer(sizeof(hmm_mat4), nullptr, vk::BufferUsageFlagBits::eUniformBuffer, false);
558-
mUniformBuffersCol[j][i] = createBuffer(sizeof(float) * 4, nullptr, vk::BufferUsageFlagBits::eUniformBuffer, false);
557+
mUniformBuffersMat[j][i] = createBuffer(sizeof(hmm_mat4), nullptr, vk::BufferUsageFlagBits::eUniformBuffer, mDisplay->cfg().vulkan.uniformBuffersInDeviceMemory ? 2 : 0);
558+
mUniformBuffersCol[j][i] = createBuffer(sizeof(float) * 4, nullptr, vk::BufferUsageFlagBits::eUniformBuffer, mDisplay->cfg().vulkan.uniformBuffersInDeviceMemory ? 2 : 0);
559559
}
560560
}
561561

@@ -966,7 +966,7 @@ void GPUDisplayBackendVulkan::createOffscreenBuffers(bool forScreenshot, bool fo
966966
{0, (float)mRenderHeight, 0.0f, 1.0f},
967967
{(float)mRenderWidth, 0, 1.0f, 0.0f},
968968
{(float)mRenderWidth, (float)mRenderHeight, 1.0f, 1.0f}};
969-
mMixingTextureVertexArray = createBuffer(sizeof(vertices), &vertices[0][0], vk::BufferUsageFlagBits::eVertexBuffer, true);
969+
mMixingTextureVertexArray = createBuffer(sizeof(vertices), &vertices[0][0], vk::BufferUsageFlagBits::eVertexBuffer, 1);
970970

971971
if (mCommandBufferPerImage) {
972972
for (unsigned int i = 0; i < mFramesInFlight; i++) {
@@ -1245,13 +1245,13 @@ void GPUDisplayBackendVulkan::clearShaders()
12451245

12461246
void GPUDisplayBackendVulkan::writeToBuffer(VulkanBuffer& buffer, size_t size, const void* srcData)
12471247
{
1248-
if (!buffer.deviceMemory) {
1248+
if (buffer.deviceMemory != 1) {
12491249
void* dstData;
12501250
CHKERR(mDevice.mapMemory(buffer.memory, 0, buffer.size, {}, &dstData));
12511251
memcpy(dstData, srcData, size);
12521252
mDevice.unmapMemory(buffer.memory);
12531253
} else {
1254-
auto tmp = createBuffer(size, srcData, vk::BufferUsageFlagBits::eTransferSrc, false);
1254+
auto tmp = createBuffer(size, srcData, vk::BufferUsageFlagBits::eTransferSrc, 0);
12551255

12561256
vk::CommandBuffer commandBuffer = getSingleTimeCommandBuffer();
12571257
vk::BufferCopy copyRegion{};
@@ -1265,7 +1265,13 @@ void GPUDisplayBackendVulkan::writeToBuffer(VulkanBuffer& buffer, size_t size, c
12651265

12661266
GPUDisplayBackendVulkan::VulkanBuffer GPUDisplayBackendVulkan::createBuffer(size_t size, const void* srcData, vk::BufferUsageFlags type, int deviceMemory)
12671267
{
1268-
vk::MemoryPropertyFlags properties = deviceMemory ? vk::MemoryPropertyFlagBits::eDeviceLocal : (vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
1268+
vk::MemoryPropertyFlags properties;
1269+
if (deviceMemory) {
1270+
properties |= vk::MemoryPropertyFlagBits::eDeviceLocal;
1271+
}
1272+
if (deviceMemory == 0 || deviceMemory == 2) {
1273+
properties |= (vk::MemoryPropertyFlagBits::eHostVisible | vk::MemoryPropertyFlagBits::eHostCoherent);
1274+
}
12691275
if (deviceMemory == 1) {
12701276
type |= vk::BufferUsageFlagBits::eTransferDst;
12711277
}
@@ -1324,7 +1330,7 @@ void GPUDisplayBackendVulkan::clearVertexBuffers()
13241330

13251331
void GPUDisplayBackendVulkan::writeToImage(VulkanImage& image, const void* srcData, size_t srcSize)
13261332
{
1327-
auto tmp = createBuffer(srcSize, srcData, vk::BufferUsageFlagBits::eTransferSrc, false);
1333+
auto tmp = createBuffer(srcSize, srcData, vk::BufferUsageFlagBits::eTransferSrc, 0);
13281334

13291335
vk::CommandBuffer commandBuffer = getSingleTimeCommandBuffer();
13301336
cmdImageMemoryBarrier(commandBuffer, image.image, {}, vk::AccessFlagBits::eTransferWrite, vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer);
@@ -1430,10 +1436,10 @@ void GPUDisplayBackendVulkan::loadDataToGPU(size_t totalVertizes)
14301436
{
14311437
mDevice.waitIdle();
14321438
clearVertexBuffers();
1433-
mVBO = createBuffer(totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data());
1439+
mVBO = createBuffer(totalVertizes * sizeof(mDisplay->vertexBuffer()[0][0]), mDisplay->vertexBuffer()[0].data(), vk::BufferUsageFlagBits::eVertexBuffer, 1);
14341440
if (mDisplay->cfgR().useGLIndirectDraw) {
14351441
fillIndirectCmdBuffer();
1436-
mIndirectCommandBuffer = createBuffer(mCmdBuffer.size() * sizeof(mCmdBuffer[0]), mCmdBuffer.data(), vk::BufferUsageFlagBits::eIndirectBuffer);
1442+
mIndirectCommandBuffer = createBuffer(mCmdBuffer.size() * sizeof(mCmdBuffer[0]), mCmdBuffer.data(), vk::BufferUsageFlagBits::eIndirectBuffer, 1);
14371443
mCmdBuffer.clear();
14381444
}
14391445
needRecordCommandBuffers();
@@ -1665,7 +1671,7 @@ void GPUDisplayBackendVulkan::finishText()
16651671
if (mFontVertexBuffer[mCurrentBufferSet].size) {
16661672
clearBuffer(mFontVertexBuffer[mCurrentBufferSet]);
16671673
}
1668-
mFontVertexBuffer[mCurrentBufferSet] = createBuffer(mFontVertexBufferHost.size() * sizeof(float), mFontVertexBufferHost.data(), vk::BufferUsageFlagBits::eVertexBuffer, false);
1674+
mFontVertexBuffer[mCurrentBufferSet] = createBuffer(mFontVertexBufferHost.size() * sizeof(float), mFontVertexBufferHost.data(), vk::BufferUsageFlagBits::eVertexBuffer, 0);
16691675

16701676
mCommandBuffersText[mCurrentBufferSet].bindPipeline(vk::PipelineBindPoint::eGraphics, mPipelines[3]);
16711677
mCommandBuffersText[mCurrentBufferSet].bindDescriptorSets(vk::PipelineBindPoint::eGraphics, mPipelineLayoutTexture, 0, 1, &mDescriptorSets[1][mCurrentBufferSet], 0, nullptr);

GPU/GPUTracking/display/GPUDisplayBackendVulkan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ class GPUDisplayBackendVulkan : public GPUDisplayBackend
4545
vk::Buffer buffer;
4646
vk::DeviceMemory memory;
4747
size_t size = 0;
48-
bool deviceMemory;
48+
int deviceMemory;
4949
};
5050
struct VulkanImage {
5151
vk::Image image;

0 commit comments

Comments
 (0)