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

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

Issue 2302333002: Small perf optimizations preparing sampled images in vulkan (Closed)
Patch Set: update comment Created 4 years, 3 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/GrVkGpuCommandBuffer.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/GrVkGpuCommandBuffer.cpp
diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
index d7a030d24156bafa10e4c588480210db287af8bf..6144cf9f8e9e6d5735a2699321e3facfb489f631 100644
--- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp
+++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp
@@ -103,7 +103,7 @@ void GrVkGpuCommandBuffer::end() {
void GrVkGpuCommandBuffer::onSubmit(const SkIRect& bounds) {
// Change layout of our render target so it can be used as the color attachment. Currently
// we don't attach the resolve to the framebuffer so no need to change its layout.
- GrVkImage* targetImage = fRenderTarget->msaaImage() ? fRenderTarget->msaaImage()
+ GrVkImage* targetImage = fRenderTarget->msaaImage() ? fRenderTarget->msaaImage()
: fRenderTarget;
targetImage->setImageLayout(fGpu,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
@@ -122,14 +122,6 @@ void GrVkGpuCommandBuffer::onSubmit(const SkIRect& bounds) {
false);
}
- for (int i = 0; i < fSampledImages.count(); ++i) {
- fSampledImages[i]->setImageLayout(fGpu,
- VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
- VK_ACCESS_SHADER_READ_BIT,
- VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
- false);
- }
-
fGpu->submitSecondaryCommandBuffer(fCommandBuffer, fRenderPass, &fColorClearValue,
fRenderTarget, bounds);
}
@@ -341,35 +333,35 @@ sk_sp<GrVkPipelineState> GrVkGpuCommandBuffer::prepareDrawState(
return pipelineState;
}
-static void append_sampled_images(const GrProcessor& processor,
- GrVkGpu* gpu,
- SkTArray<GrVkImage*>* sampledImages) {
- if (int numTextures = processor.numTextures()) {
- GrVkImage** images = sampledImages->push_back_n(numTextures);
- int i = 0;
- do {
- const GrTextureAccess& texAccess = processor.textureAccess(i);
- GrVkTexture* vkTexture = static_cast<GrVkTexture*>(processor.texture(i));
- SkASSERT(vkTexture);
-
- // We may need to resolve the texture first if it is also a render target
- GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(vkTexture->asRenderTarget());
- if (texRT) {
- gpu->onResolveRenderTarget(texRT);
- }
+static void prepare_sampled_images(const GrProcessor& processor, GrVkGpu* gpu) {
+ for (int i = 0; i < processor.numTextures(); ++i) {
+ const GrTextureAccess& texAccess = processor.textureAccess(i);
+ GrVkTexture* vkTexture = static_cast<GrVkTexture*>(processor.texture(i));
+ SkASSERT(vkTexture);
- const GrTextureParams& params = texAccess.getParams();
- // Check if we need to regenerate any mip maps
- if (GrTextureParams::kMipMap_FilterMode == params.filterMode()) {
- if (vkTexture->texturePriv().mipMapsAreDirty()) {
- gpu->generateMipmap(vkTexture);
- vkTexture->texturePriv().dirtyMipMaps(false);
- }
- }
+ // We may need to resolve the texture first if it is also a render target
+ GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(vkTexture->asRenderTarget());
+ if (texRT) {
+ gpu->onResolveRenderTarget(texRT);
+ }
- images[i] = vkTexture;
- } while (++i < numTextures);
+ const GrTextureParams& params = texAccess.getParams();
+ // Check if we need to regenerate any mip maps
+ if (GrTextureParams::kMipMap_FilterMode == params.filterMode()) {
+ if (vkTexture->texturePriv().mipMapsAreDirty()) {
+ gpu->generateMipmap(vkTexture);
+ vkTexture->texturePriv().dirtyMipMaps(false);
+ }
+ }
+ // TODO: If we ever decide to create the secondary command buffers ahead of time before we
+ // are actually going to submit them, we will need to track the sampled images and delay
+ // adding the layout change/barrier until we are ready to submit.
+ vkTexture->setImageLayout(gpu,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_ACCESS_SHADER_READ_BIT,
+ VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
+ false);
}
}
@@ -385,11 +377,11 @@ void GrVkGpuCommandBuffer::onDraw(const GrPipeline& pipeline,
const GrVkRenderPass* renderPass = vkRT->simpleRenderPass();
SkASSERT(renderPass);
- append_sampled_images(primProc, fGpu, &fSampledImages);
+ prepare_sampled_images(primProc, fGpu);
for (int i = 0; i < pipeline.numFragmentProcessors(); ++i) {
- append_sampled_images(pipeline.getFragmentProcessor(i), fGpu, &fSampledImages);
+ prepare_sampled_images(pipeline.getFragmentProcessor(i), fGpu);
}
- append_sampled_images(pipeline.getXferProcessor(), fGpu, &fSampledImages);
+ prepare_sampled_images(pipeline.getXferProcessor(), fGpu);
GrPrimitiveType primitiveType = meshes[0].primitiveType();
sk_sp<GrVkPipelineState> pipelineState = this->prepareDrawState(pipeline,
« no previous file with comments | « src/gpu/vk/GrVkGpuCommandBuffer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698