Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(643)

Unified Diff: src/gpu/vk/GrVkProgramDataManager.cpp

Issue 1774963003: Buffer fix for VkProgram caching (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/vk/GrVkProgramDataManager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/vk/GrVkProgramDataManager.cpp
diff --git a/src/gpu/vk/GrVkProgramDataManager.cpp b/src/gpu/vk/GrVkProgramDataManager.cpp
index f189097b973be0dd21ea45836a457cf1461bc2b3..e798cd7460ddb039d3ab0f72c1ca46b33d61a689 100644
--- a/src/gpu/vk/GrVkProgramDataManager.cpp
+++ b/src/gpu/vk/GrVkProgramDataManager.cpp
@@ -14,7 +14,9 @@ GrVkProgramDataManager::GrVkProgramDataManager(const UniformInfoArray& uniforms,
uint32_t vertexUniformSize,
uint32_t fragmentUniformSize)
: fVertexUniformSize(vertexUniformSize)
- , fFragmentUniformSize(fragmentUniformSize) {
+ , fFragmentUniformSize(fragmentUniformSize)
+ , fVertexUniformsDirty(false)
+ , fFragmentUniformsDirty(false) {
fVertexUniformData.reset(vertexUniformSize);
fFragmentUniformData.reset(fragmentUniformSize);
int count = uniforms.count();
@@ -38,19 +40,27 @@ GrVkProgramDataManager::GrVkProgramDataManager(const UniformInfoArray& uniforms,
}
}
-void GrVkProgramDataManager::set1f(UniformHandle u, float v0) const {
- const Uniform& uni = fUniforms[u.toIndex()];
- SkASSERT(uni.fType == kFloat_GrSLType);
- SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount);
- SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
+void* GrVkProgramDataManager::getBufferPtrAndMarkDirty(const Uniform& uni) const {
void* buffer;
if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
buffer = fVertexUniformData.get();
- } else {
+ fVertexUniformsDirty = true;
+ }
+ else {
SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
buffer = fFragmentUniformData.get();
+ fFragmentUniformsDirty = true;
}
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ buffer = static_cast<char*>(buffer)+uni.fOffset;
+ return buffer;
+}
+
+void GrVkProgramDataManager::set1f(UniformHandle u, float v0) const {
+ const Uniform& uni = fUniforms[u.toIndex()];
+ SkASSERT(uni.fType == kFloat_GrSLType);
+ SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount);
+ SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
memcpy(buffer, &v0, sizeof(float));
}
@@ -65,14 +75,7 @@ void GrVkProgramDataManager::set1fv(UniformHandle u,
(1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount));
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
for (int i = 0; i < arrayCount; ++i) {
const float* curVec = &v[i];
@@ -86,14 +89,7 @@ void GrVkProgramDataManager::set2f(UniformHandle u, float v0, float v1) const {
SkASSERT(uni.fType == kVec2f_GrSLType);
SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount);
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
float v[2] = { v0, v1 };
memcpy(buffer, v, 2 * sizeof(float));
@@ -109,14 +105,7 @@ void GrVkProgramDataManager::set2fv(UniformHandle u,
(1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount));
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
for (int i = 0; i < arrayCount; ++i) {
const float* curVec = &v[2 * i];
@@ -130,14 +119,7 @@ void GrVkProgramDataManager::set3f(UniformHandle u, float v0, float v1, float v2
SkASSERT(uni.fType == kVec3f_GrSLType);
SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount);
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
float v[3] = { v0, v1, v2 };
memcpy(buffer, v, 3 * sizeof(float));
@@ -153,14 +135,7 @@ void GrVkProgramDataManager::set3fv(UniformHandle u,
(1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount));
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
for (int i = 0; i < arrayCount; ++i) {
const float* curVec = &v[3 * i];
@@ -174,14 +149,7 @@ void GrVkProgramDataManager::set4f(UniformHandle u, float v0, float v1, float v2
SkASSERT(uni.fType == kVec4f_GrSLType);
SkASSERT(GrGLSLShaderVar::kNonArray == uni.fArrayCount);
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
float v[4] = { v0, v1, v2, v3 };
memcpy(buffer, v, 4 * sizeof(float));
@@ -197,14 +165,7 @@ void GrVkProgramDataManager::set4fv(UniformHandle u,
(1 == arrayCount && GrGLSLShaderVar::kNonArray == uni.fArrayCount));
SkASSERT(GrVkUniformHandler::kUniformBufferDescSet == uni.fSetNumber);
- void* buffer;
- if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
- buffer = fVertexUniformData.get();
- } else {
- SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
- buffer = fFragmentUniformData.get();
- }
- buffer = static_cast<char*>(buffer) + uni.fOffset;
+ void* buffer = this->getBufferPtrAndMarkDirty(uni);
SkASSERT(sizeof(float) == 4);
memcpy(buffer, v, arrayCount * 4 * sizeof(float));
}
@@ -236,8 +197,8 @@ void GrVkProgramDataManager::setMatrix4fv(UniformHandle u, int arrayCount, const
template<int N> struct set_uniform_matrix;
template<int N> inline void GrVkProgramDataManager::setMatrices(UniformHandle u,
- int arrayCount,
- const float matrices[]) const {
+ int arrayCount,
+ const float matrices[]) const {
const Uniform& uni = fUniforms[u.toIndex()];
SkASSERT(uni.fType == kMat22f_GrSLType + (N - 2));
SkASSERT(arrayCount > 0);
@@ -248,9 +209,11 @@ template<int N> inline void GrVkProgramDataManager::setMatrices(UniformHandle u,
void* buffer;
if (GrVkUniformHandler::kVertexBinding == uni.fBinding) {
buffer = fVertexUniformData.get();
+ fVertexUniformsDirty = true;
} else {
SkASSERT(GrVkUniformHandler::kFragBinding == uni.fBinding);
buffer = fFragmentUniformData.get();
+ fFragmentUniformsDirty = true;
}
set_uniform_matrix<N>::set(buffer, uni.fOffset, arrayCount, matrices);
@@ -283,7 +246,7 @@ template<> struct set_uniform_matrix<4> {
void GrVkProgramDataManager::uploadUniformBuffers(const GrVkGpu* gpu,
GrVkUniformBuffer* vertexBuffer,
GrVkUniformBuffer* fragmentBuffer) const {
- if (vertexBuffer) {
+ if (vertexBuffer && fVertexUniformsDirty) {
vertexBuffer->addMemoryBarrier(gpu,
VK_ACCESS_UNIFORM_READ_BIT,
VK_ACCESS_HOST_WRITE_BIT,
@@ -291,9 +254,10 @@ void GrVkProgramDataManager::uploadUniformBuffers(const GrVkGpu* gpu,
VK_PIPELINE_STAGE_HOST_BIT,
false);
SkAssertResult(vertexBuffer->updateData(gpu, fVertexUniformData.get(), fVertexUniformSize));
+ fVertexUniformsDirty = false;
}
- if (fragmentBuffer) {
+ if (fragmentBuffer && fFragmentUniformsDirty) {
fragmentBuffer->addMemoryBarrier(gpu,
VK_ACCESS_UNIFORM_READ_BIT,
VK_ACCESS_HOST_WRITE_BIT,
@@ -302,6 +266,7 @@ void GrVkProgramDataManager::uploadUniformBuffers(const GrVkGpu* gpu,
false);
SkAssertResult(fragmentBuffer->updateData(gpu, fFragmentUniformData.get(),
fFragmentUniformSize));
+ fFragmentUniformsDirty = false;
}
}
« no previous file with comments | « src/gpu/vk/GrVkProgramDataManager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698