Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit f61272f

Browse files
courtney-gCommit Bot
authored and
Commit Bot
committed
Add support for VK_KHR_sampler_ycbcr_conversion
This adds ability for applications to import Android Hardware Buffers (AHBs) as OpenGL images which in turn can be sampled from and/or written. This was specifically tested with the common use case of importing a buffer created by an media decoder and using that as a texture source to include that video content on the screen. Tested with: - Angry Birds 2 video player (for ads) requires YUV conversion. - Basic Media Decoder example: https://github.com/android/media-samples/tree/master/BasicMediaDecoder Bug: b/155487768 Change-Id: I9255450f81aa4daa2aace7205d4f6c3f225abcca Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2175103 Commit-Queue: Courtney Goeltzenleuchter <[email protected]> Reviewed-by: Courtney Goeltzenleuchter <[email protected]> Reviewed-by: Tim Van Patten <[email protected]> Reviewed-by: Jamie Madill <[email protected]>
1 parent b549be9 commit f61272f

26 files changed

+448
-69
lines changed

include/platform/FeaturesVk.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,11 @@ struct FeaturesVk : FeatureSetBase
122122

123123
// Whether the VkDevice supports the VK_FUCHSIA_external_memory
124124
// extension, on which the GL_ANGLE_memory_object_fuchsia extension can be layered.
125-
angle::Feature supportsExternalMemoryFuchsia = {
125+
Feature supportsExternalMemoryFuchsia = {
126126
"supports_external_memory_fuchsia", FeatureCategory::VulkanFeatures,
127127
"VkDevice supports the VK_FUCHSIA_external_memory extension", &members};
128128

129-
angle::Feature supportsFilteringPrecision = {
129+
Feature supportsFilteringPrecision = {
130130
"supports_filtering_precision_google", FeatureCategory::VulkanFeatures,
131131
"VkDevice supports the VK_GOOGLE_sampler_filtering_precision extension", &members};
132132

@@ -172,6 +172,12 @@ struct FeaturesVk : FeatureSetBase
172172
"supports_shader_stencil_export", FeatureCategory::VulkanFeatures,
173173
"VkDevice supports the VK_EXT_shader_stencil_export extension", &members};
174174

175+
// Whether the VkDevice supports the VK_KHR_sampler_ycbcr_conversion extension, which is needed
176+
// to support Ycbcr conversion with external images.
177+
Feature supportsYUVSamplerConversion = {
178+
"supports_yuv_sampler_conversion", FeatureCategory::VulkanFeatures,
179+
"VkDevice supports the VK_KHR_sampler_ycbcr_conversion extension", &members};
180+
175181
// Where VK_EXT_transform_feedback is not support, an emulation path is used.
176182
// http://anglebug.com/3205
177183
Feature emulateTransformFeedback = {

scripts/code_generation_hashes/Vulkan_format.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
"src/libANGLE/renderer/angle_format_map.json":
55
"c79d833aea7007c7d0d51cdaa9b265a6",
66
"src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
7-
"d8a0f2278c09a49049a73930b9da3719",
7+
"54a7374f93f17da1386600027acca7a3",
88
"src/libANGLE/renderer/vulkan/vk_format_map.json":
99
"738c8dc36fbe212669944e88ae918f9c",
1010
"src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
11-
"383749c786e957bdbbbce9d8b5c2441a"
11+
"c7e01cbf1eded87f4ed9f3bc8b7a567c"
1212
}

src/common/vulkan/vk_headers.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ extern PFN_vkImportFenceFdKHR vkImportFenceFdKHR;
6464
extern PFN_vkGetPhysicalDeviceExternalSemaphorePropertiesKHR
6565
vkGetPhysicalDeviceExternalSemaphorePropertiesKHR;
6666

67+
// VK_KHR_sampler_ycbcr_conversion
68+
extern PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionKHR;
69+
extern PFN_vkDestroySamplerYcbcrConversionKHR vkDestroySamplerYcbcrConversionKHR;
70+
6771
# if defined(ANGLE_PLATFORM_FUCHSIA)
6872
// VK_FUCHSIA_imagepipe_surface
6973
extern PFN_vkCreateImagePipeSurfaceFUCHSIA vkCreateImagePipeSurfaceFUCHSIA;

src/libANGLE/renderer/vulkan/ContextVk.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3748,6 +3748,7 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context)
37483748
const gl::ActiveTextureMask &activeTextures = executable->getActiveSamplersMask();
37493749
const gl::ActiveTextureTypeArray &textureTypes = executable->getActiveSamplerTypes();
37503750

3751+
bool haveImmutableSampler = false;
37513752
for (size_t textureUnit : activeTextures)
37523753
{
37533754
gl::Texture *texture = textures[textureUnit];
@@ -3776,13 +3777,24 @@ angle::Result ContextVk::updateActiveTextures(const gl::Context *context)
37763777
samplerSerial = samplerVk->getSerial();
37773778
}
37783779

3780+
if (textureVk->getImage().hasImmutableSampler())
3781+
{
3782+
haveImmutableSampler = true;
3783+
}
3784+
37793785
mActiveTextures[textureUnit].texture = textureVk;
37803786
mActiveTextures[textureUnit].sampler = samplerVk;
37813787
// Cache serials from sampler and texture, but re-use texture if no sampler bound
37823788
ASSERT(textureVk != nullptr);
37833789
mActiveTexturesDesc.update(textureUnit, textureVk->getSerial(), samplerSerial);
37843790
}
37853791

3792+
if (haveImmutableSampler)
3793+
{
3794+
ANGLE_TRY(mExecutable->updatePipelineLayout(context, &mActiveTextures));
3795+
invalidateCurrentGraphicsPipeline();
3796+
}
3797+
37863798
return angle::Result::Continue;
37873799
}
37883800

src/libANGLE/renderer/vulkan/ImageVk.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,13 @@ egl::Error ImageVk::initialize(const egl::Display *display)
9797
return egl::EglBadAccess();
9898
}
9999

100+
// start with some reasonable alignment that's safe for the case where intendedFormatID is
101+
// FormatID::NONE
102+
size_t alignment = mImage->getFormat().getValidImageCopyBufferAlignment();
103+
100104
// Make sure a staging buffer is ready to use to upload data
101-
mImage->initStagingBuffer(renderer, mImage->getFormat().getImageCopyBufferAlignment(),
102-
vk::kStagingBufferFlags, vk::kStagingBufferSize);
105+
mImage->initStagingBuffer(renderer, alignment, vk::kStagingBufferFlags,
106+
vk::kStagingBufferSize);
103107

104108
mOwnsImage = false;
105109

src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ angle::Result MemoryObjectVk::createImage(ContextVk *contextVk,
245245

246246
VkMemoryPropertyFlags flags = 0;
247247
ANGLE_TRY(image->initExternalMemory(contextVk, renderer->getMemoryProperties(),
248-
externalMemoryRequirements, importMemoryInfo,
248+
externalMemoryRequirements, nullptr, importMemoryInfo,
249249
renderer->getQueueFamilyIndex(), flags));
250250

251251
return angle::Result::Continue;

src/libANGLE/renderer/vulkan/ProgramExecutableVk.cpp

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -446,9 +446,11 @@ void ProgramExecutableVk::addImageDescriptorSetDesc(const gl::ProgramExecutable
446446
}
447447
}
448448

449-
void ProgramExecutableVk::addTextureDescriptorSetDesc(const gl::ProgramState &programState,
450-
bool useOldRewriteStructSamplers,
451-
vk::DescriptorSetLayoutDesc *descOut)
449+
void ProgramExecutableVk::addTextureDescriptorSetDesc(
450+
const gl::ProgramState &programState,
451+
bool useOldRewriteStructSamplers,
452+
const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures,
453+
vk::DescriptorSetLayoutDesc *descOut)
452454
{
453455
const std::vector<gl::SamplerBinding> &samplerBindings = programState.getSamplerBindings();
454456
const std::vector<gl::LinkedUniform> &uniforms = programState.getUniforms();
@@ -493,8 +495,25 @@ void ProgramExecutableVk::addTextureDescriptorSetDesc(const gl::ProgramState &pr
493495
ShaderInterfaceVariableInfo &info = mVariableInfoMap[shaderType][samplerName];
494496
VkShaderStageFlags activeStages = gl_vk::kShaderStageMap[shaderType];
495497

496-
descOut->update(info.binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, arraySize,
497-
activeStages, nullptr);
498+
// TODO: https://issuetracker.google.com/issues/158215272: how do we handle array of
499+
// immutable samplers?
500+
GLuint textureUnit = samplerBinding.boundTextureUnits[0];
501+
if (activeTextures &&
502+
((*activeTextures)[textureUnit].texture->getImage().hasImmutableSampler()))
503+
{
504+
ASSERT(samplerBinding.boundTextureUnits.size() == 1);
505+
// Always take the texture's sampler, that's only way to get to yuv conversion for
506+
// externalFormat
507+
const vk::Sampler &immutableSampler =
508+
(*activeTextures)[textureUnit].texture->getSampler();
509+
descOut->update(info.binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, arraySize,
510+
activeStages, &immutableSampler);
511+
}
512+
else
513+
{
514+
descOut->update(info.binding, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, arraySize,
515+
activeStages, nullptr);
516+
}
498517
}
499518
}
500519
}
@@ -610,7 +629,11 @@ angle::Result ProgramExecutableVk::getComputePipeline(ContextVk *contextVk,
610629
return shaderProgram->getComputePipeline(contextVk, getPipelineLayout(), pipelineOut);
611630
}
612631

613-
angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glContext)
632+
// updatePipelineLayout is used to create the DescriptorSetLayout(s) and PipelineLayout and update
633+
// them when we discover that an immutable sampler is in use.
634+
angle::Result ProgramExecutableVk::updatePipelineLayout(
635+
const gl::Context *glContext,
636+
gl::ActiveTextureArray<vk::TextureUnit> *activeTextures)
614637
{
615638
const gl::State &glState = glContext->getState();
616639
ContextVk *contextVk = vk::GetImpl(glContext);
@@ -621,13 +644,12 @@ angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glCon
621644
gl::ShaderMap<const gl::ProgramState *> programStates;
622645
fillProgramStateMap(contextVk, &programStates);
623646

624-
reset(contextVk);
625-
626647
// Store a reference to the pipeline and descriptor set layouts. This will create them if they
627648
// don't already exist in the cache.
628649

629650
// Default uniforms and transform feedback:
630651
vk::DescriptorSetLayoutDesc uniformsAndXfbSetDesc;
652+
mNumDefaultUniformDescriptors = 0;
631653
for (const gl::ShaderType shaderType : linkedShaderStages)
632654
{
633655
const std::string uniformBlockName = kDefaultUniformNames[shaderType];
@@ -693,7 +715,7 @@ angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glCon
693715
const gl::ProgramState *programState = programStates[shaderType];
694716
ASSERT(programState);
695717
addTextureDescriptorSetDesc(*programState, contextVk->useOldRewriteStructSamplers(),
696-
&texturesSetDesc);
718+
activeTextures, &texturesSetDesc);
697719
}
698720

699721
ANGLE_TRY(renderer->getDescriptorSetLayout(contextVk, texturesSetDesc,
@@ -721,6 +743,22 @@ angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glCon
721743
ANGLE_TRY(renderer->getPipelineLayout(contextVk, pipelineLayoutDesc, mDescriptorSetLayouts,
722744
&mPipelineLayout));
723745

746+
return angle::Result::Continue;
747+
}
748+
749+
angle::Result ProgramExecutableVk::createPipelineLayout(const gl::Context *glContext)
750+
{
751+
ContextVk *contextVk = vk::GetImpl(glContext);
752+
RendererVk *renderer = contextVk->getRenderer();
753+
const gl::ProgramExecutable &glExecutable = getGlExecutable();
754+
const gl::ShaderBitSet &linkedShaderStages = glExecutable.getLinkedShaderStages();
755+
gl::ShaderMap<const gl::ProgramState *> programStates;
756+
fillProgramStateMap(contextVk, &programStates);
757+
758+
reset(contextVk);
759+
760+
ANGLE_TRY(updatePipelineLayout(glContext, nullptr));
761+
724762
// Initialize descriptor pools.
725763
std::array<VkDescriptorPoolSize, 2> uniformAndXfbSetSize = {
726764
{{VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC,
@@ -1302,6 +1340,10 @@ angle::Result ProgramExecutableVk::updateTexturesDescriptorSet(ContextVk *contex
13021340
textureVk->getReadImageViewAndRecordUse(contextVk).getHandle();
13031341
}
13041342

1343+
if (textureVk->getImage().hasImmutableSampler())
1344+
{
1345+
imageInfos[arrayElement].sampler = textureVk->getSampler().getHandle();
1346+
}
13051347
ShaderInterfaceVariableInfoMap &variableInfoMap = mVariableInfoMap[shaderType];
13061348
const std::string samplerName =
13071349
contextVk->getRenderer()->getFeatures().forceOldRewriteStructSamplers.enabled

src/libANGLE/renderer/vulkan/ProgramExecutableVk.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ class ProgramExecutableVk
137137

138138
const vk::PipelineLayout &getPipelineLayout() const { return mPipelineLayout.get(); }
139139
angle::Result createPipelineLayout(const gl::Context *glContext);
140+
angle::Result updatePipelineLayout(const gl::Context *glContext,
141+
gl::ActiveTextureArray<vk::TextureUnit> *activeTextures);
140142

141143
angle::Result updateTexturesDescriptorSet(ContextVk *contextVk);
142144
angle::Result updateShaderResourcesDescriptorSet(ContextVk *contextVk,
@@ -182,6 +184,7 @@ class ProgramExecutableVk
182184
vk::DescriptorSetLayoutDesc *descOut);
183185
void addTextureDescriptorSetDesc(const gl::ProgramState &programState,
184186
bool useOldRewriteStructSamplers,
187+
const gl::ActiveTextureArray<vk::TextureUnit> *activeTextures,
185188
vk::DescriptorSetLayoutDesc *descOut);
186189

187190
void updateDefaultUniformsDescriptorSet(

src/libANGLE/renderer/vulkan/RendererVk.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,7 @@ void RendererVk::onDestroy()
492492

493493
mPipelineCache.destroy(mDevice);
494494
mSamplerCache.destroy(this);
495+
mYuvConversionCache.destroy(this);
495496
mTheNullBuffer.destroy(this);
496497

497498
mAllocator.destroy();
@@ -886,6 +887,10 @@ void RendererVk::queryDeviceExtensionFeatures(const ExtensionNameList &deviceExt
886887
mExternalSemaphoreProperties = {};
887888
mExternalSemaphoreProperties.sType = VK_STRUCTURE_TYPE_EXTERNAL_SEMAPHORE_PROPERTIES;
888889

890+
mSamplerYcbcrConversionFeatures = {};
891+
mSamplerYcbcrConversionFeatures.sType =
892+
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
893+
889894
if (!vkGetPhysicalDeviceProperties2KHR || !vkGetPhysicalDeviceFeatures2KHR)
890895
{
891896
return;
@@ -935,6 +940,12 @@ void RendererVk::queryDeviceExtensionFeatures(const ExtensionNameList &deviceExt
935940
vk::AddToPNextChain(&deviceProperties, &mExternalMemoryHostProperties);
936941
}
937942

943+
// Query Ycbcr conversion properties
944+
if (ExtensionFound(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME, deviceExtensionNames))
945+
{
946+
vk::AddToPNextChain(&deviceFeatures, &mSamplerYcbcrConversionFeatures);
947+
}
948+
938949
// Query subgroup properties
939950
vk::AddToPNextChain(&deviceProperties, &mSubgroupProperties);
940951

@@ -972,6 +983,13 @@ void RendererVk::queryDeviceExtensionFeatures(const ExtensionNameList &deviceExt
972983
mIndexTypeUint8Features.pNext = nullptr;
973984
mSubgroupProperties.pNext = nullptr;
974985
mExternalMemoryHostProperties.pNext = nullptr;
986+
mLineRasterizationFeatures.pNext = nullptr;
987+
mProvokingVertexFeatures.pNext = nullptr;
988+
mVertexAttributeDivisorFeatures.pNext = nullptr;
989+
mVertexAttributeDivisorProperties.pNext = nullptr;
990+
mTransformFeedbackFeatures.pNext = nullptr;
991+
mIndexTypeUint8Features.pNext = nullptr;
992+
mSamplerYcbcrConversionFeatures.pNext = nullptr;
975993
}
976994

977995
angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueFamilyIndex)
@@ -1274,6 +1292,12 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
12741292
#endif // !defined(ANGLE_SHARED_LIBVULKAN)
12751293
}
12761294

1295+
if (getFeatures().supportsYUVSamplerConversion.enabled)
1296+
{
1297+
enabledDeviceExtensions.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1298+
vk::AddToPNextChain(&createInfo, &mSamplerYcbcrConversionFeatures);
1299+
}
1300+
12771301
createInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
12781302
createInfo.flags = 0;
12791303
createInfo.queueCreateInfoCount = 1;
@@ -1325,6 +1349,10 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
13251349
{
13261350
InitTransformFeedbackEXTFunctions(mDevice);
13271351
}
1352+
if (getFeatures().supportsYUVSamplerConversion.enabled)
1353+
{
1354+
InitSamplerYcbcrKHRFunctions(mDevice);
1355+
}
13281356
#endif // !defined(ANGLE_SHARED_LIBVULKAN)
13291357

13301358
// Initialize the vulkan pipeline cache.
@@ -1730,6 +1758,9 @@ void RendererVk::initFeatures(DisplayVk *displayVk, const ExtensionNameList &dev
17301758
// Currently disabled by default: http://anglebug.com/4324
17311759
ANGLE_FEATURE_CONDITION(&mFeatures, enableCommandProcessingThread, false);
17321760

1761+
ANGLE_FEATURE_CONDITION(&mFeatures, supportsYUVSamplerConversion,
1762+
mSamplerYcbcrConversionFeatures.samplerYcbcrConversion != VK_FALSE);
1763+
17331764
angle::PlatformMethods *platform = ANGLEPlatformCurrent();
17341765
platform->overrideFeaturesVk(platform, &mFeatures);
17351766

src/libANGLE/renderer/vulkan/RendererVk.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ class RendererVk : angle::NonCopyable
247247
bool enableDebugUtils() const { return mEnableDebugUtils; }
248248

249249
SamplerCache &getSamplerCache() { return mSamplerCache; }
250+
SamplerYcbcrConversionCache &getYuvConversionCache() { return mYuvConversionCache; }
250251
vk::ActiveHandleCounter &getActiveHandleCounts() { return mActiveHandleCounts; }
251252

252253
// Queue commands to worker thread for processing
@@ -309,6 +310,7 @@ class RendererVk : angle::NonCopyable
309310
VkPhysicalDeviceExternalMemoryHostPropertiesEXT mExternalMemoryHostProperties;
310311
VkExternalFenceProperties mExternalFenceProperties;
311312
VkExternalSemaphoreProperties mExternalSemaphoreProperties;
313+
VkPhysicalDeviceSamplerYcbcrConversionFeatures mSamplerYcbcrConversionFeatures;
312314
std::vector<VkQueueFamilyProperties> mQueueFamilyProperties;
313315
std::mutex mQueueMutex;
314316
angle::PackedEnumMap<egl::ContextPriority, VkQueue> mQueues;
@@ -382,6 +384,7 @@ class RendererVk : angle::NonCopyable
382384

383385
vk::Allocator mAllocator;
384386
SamplerCache mSamplerCache;
387+
SamplerYcbcrConversionCache mYuvConversionCache;
385388
vk::ActiveHandleCounter mActiveHandleCounts;
386389

387390
// Vulkan does not allow binding a null vertex buffer. We use a dummy as a placeholder.

src/libANGLE/renderer/vulkan/SamplerVk.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ angle::Result SamplerVk::syncState(const gl::Context *context, const bool dirty)
3939
mSampler.reset();
4040
}
4141

42-
vk::SamplerDesc desc(mState, false);
42+
vk::SamplerDesc desc(mState, false, 0);
4343
ANGLE_TRY(renderer->getSamplerCache().getSampler(contextVk, desc, &mSampler));
4444

4545
// Regenerate the serial on a sampler change.

src/libANGLE/renderer/vulkan/SurfaceVk.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,9 @@ angle::Result OffscreenSurfaceVk::AttachmentImage::initializeWithExternalMemory(
210210
image.getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements);
211211

212212
VkMemoryPropertyFlags flags = 0;
213-
ANGLE_TRY(image.initExternalMemory(displayVk, renderer->getMemoryProperties(),
214-
externalMemoryRequirements, &importMemoryHostPointerInfo,
215-
VK_QUEUE_FAMILY_EXTERNAL, flags));
213+
ANGLE_TRY(image.initExternalMemory(
214+
displayVk, renderer->getMemoryProperties(), externalMemoryRequirements, nullptr,
215+
&importMemoryHostPointerInfo, VK_QUEUE_FAMILY_EXTERNAL, flags));
216216

217217
return angle::Result::Continue;
218218
}

src/libANGLE/renderer/vulkan/TextureVk.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,8 @@ angle::Result TextureVk::syncState(const gl::Context *context,
18841884
mImage->getLevelCount(), layerCount));
18851885
}
18861886

1887-
vk::SamplerDesc samplerDesc(mState.getSamplerState(), mState.isStencilMode());
1887+
vk::SamplerDesc samplerDesc(mState.getSamplerState(), mState.isStencilMode(),
1888+
mImage->getExternalFormat());
18881889
ANGLE_TRY(renderer->getSamplerCache().getSampler(contextVk, samplerDesc, &mSampler));
18891890

18901891
// Regenerate the serial on a sampler change.

src/libANGLE/renderer/vulkan/TextureVk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ class TextureVk : public TextureImpl, public angle::ObserverInterface
413413
// reallocated independently of |mImage| on state changes.
414414
vk::ImageViewHelper mImageViews;
415415

416-
// |mSampler| contains the relevant Vulkan sampler states reprensenting the OpenGL Texture
416+
// |mSampler| contains the relevant Vulkan sampler states representing the OpenGL Texture
417417
// sampling states for the Texture.
418418
vk::BindingPointer<vk::Sampler> mSampler;
419419

0 commit comments

Comments
 (0)