Indicate texel buffer support in Vulkan

Also adds support for static texel buffer access patterns.

Bug: skia:
Change-Id: Iadf1b82adbc5f84960841b7526e16d1aa77de621
Reviewed-on: https://skia-review.googlesource.com/21705
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/vk/GrVkBuffer.cpp b/src/gpu/vk/GrVkBuffer.cpp
index d0332b9..9926ec4 100644
--- a/src/gpu/vk/GrVkBuffer.cpp
+++ b/src/gpu/vk/GrVkBuffer.cpp
@@ -227,6 +227,6 @@
 
 void GrVkBuffer::validate() const {
     SkASSERT(!fResource || kVertex_Type == fDesc.fType || kIndex_Type == fDesc.fType
-             || kCopyRead_Type == fDesc.fType || kCopyWrite_Type == fDesc.fType
-             || kUniform_Type == fDesc.fType);
+             || kTexel_Type == fDesc.fType || kCopyRead_Type == fDesc.fType
+             || kCopyWrite_Type == fDesc.fType || kUniform_Type == fDesc.fType);
 }
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index e8a3978..db92617 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -248,6 +248,8 @@
     }
 
     shaderCaps->fIntegerSupport = true;
+    shaderCaps->fTexelBufferSupport = true;
+    shaderCaps->fTexelFetchSupport = true;
     shaderCaps->fVertexIDSupport = true;
 
     // Assume the minimum precisions mandated by the SPIR-V spec.
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 13de0a1..3790127 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -311,8 +311,9 @@
             buff = GrVkTransferBuffer::Create(this, size, GrVkBuffer::kCopyWrite_Type);
             break;
         case kTexel_GrBufferType:
-            SkASSERT(kDynamic_GrAccessPattern == accessPattern);
-            buff = GrVkTexelBuffer::Create(this, size);
+            SkASSERT(kDynamic_GrAccessPattern == accessPattern ||
+                     kStatic_GrAccessPattern == accessPattern);
+            buff = GrVkTexelBuffer::Create(this, size, kDynamic_GrAccessPattern == accessPattern);
             break;
         case kDrawIndirect_GrBufferType:
             SkFAIL("DrawIndirect Buffers not supported  in vulkan backend.");
diff --git a/src/gpu/vk/GrVkTexelBuffer.cpp b/src/gpu/vk/GrVkTexelBuffer.cpp
index b579ea0..501706c 100644
--- a/src/gpu/vk/GrVkTexelBuffer.cpp
+++ b/src/gpu/vk/GrVkTexelBuffer.cpp
@@ -17,9 +17,9 @@
     this->registerWithCache(SkBudgeted::kYes);
 }
 
-GrVkTexelBuffer* GrVkTexelBuffer::Create(GrVkGpu* gpu, size_t size) {
+GrVkTexelBuffer* GrVkTexelBuffer::Create(GrVkGpu* gpu, size_t size, bool dynamic) {
     GrVkBuffer::Desc desc;
-    desc.fDynamic = true;
+    desc.fDynamic = dynamic;
     desc.fType = GrVkBuffer::kTexel_Type;
     desc.fSizeInBytes = size;
 
diff --git a/src/gpu/vk/GrVkTexelBuffer.h b/src/gpu/vk/GrVkTexelBuffer.h
index 449e3fc..0ca114d 100644
--- a/src/gpu/vk/GrVkTexelBuffer.h
+++ b/src/gpu/vk/GrVkTexelBuffer.h
@@ -15,7 +15,7 @@
 
 class GrVkTexelBuffer : public GrBuffer, public GrVkBuffer {
 public:
-    static GrVkTexelBuffer* Create(GrVkGpu* gpu, size_t size);
+    static GrVkTexelBuffer* Create(GrVkGpu* gpu, size_t size, bool dynamic);
 
 protected:
     void onAbandon() override;