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; |
} |
} |