| Index: src/gpu/vk/GrVkSampler.cpp
|
| diff --git a/src/gpu/vk/GrVkSampler.cpp b/src/gpu/vk/GrVkSampler.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d50c7f37447a5a9da0b3c9010aa3e6024ed6bb6c
|
| --- /dev/null
|
| +++ b/src/gpu/vk/GrVkSampler.cpp
|
| @@ -0,0 +1,74 @@
|
| +/*
|
| +* Copyright 2016 Google Inc.
|
| +*
|
| +* Use of this source code is governed by a BSD-style license that can be
|
| +* found in the LICENSE file.
|
| +*/
|
| +
|
| +#include "GrVkSampler.h"
|
| +
|
| +#include "GrTextureAccess.h"
|
| +#include "GrVkGpu.h"
|
| +
|
| +static inline VkSamplerAddressMode tile_to_vk_sampler_address(SkShader::TileMode tm) {
|
| + static const VkSamplerAddressMode gWrapModes[] = {
|
| + VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
|
| + VK_SAMPLER_ADDRESS_MODE_REPEAT,
|
| + VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT
|
| + };
|
| + GR_STATIC_ASSERT(SkShader::kTileModeCount == SK_ARRAY_COUNT(gWrapModes));
|
| + GR_STATIC_ASSERT(0 == SkShader::kClamp_TileMode);
|
| + GR_STATIC_ASSERT(1 == SkShader::kRepeat_TileMode);
|
| + GR_STATIC_ASSERT(2 == SkShader::kMirror_TileMode);
|
| + return gWrapModes[tm];
|
| +}
|
| +
|
| +GrVkSampler* GrVkSampler::Create(const GrVkGpu* gpu, const GrTextureAccess& textureAccess) {
|
| +
|
| + static VkFilter vkMinFilterModes[] = {
|
| + VK_FILTER_NEAREST,
|
| + VK_FILTER_LINEAR,
|
| + VK_FILTER_LINEAR
|
| + };
|
| + static VkFilter vkMagFilterModes[] = {
|
| + VK_FILTER_NEAREST,
|
| + VK_FILTER_LINEAR,
|
| + VK_FILTER_LINEAR
|
| + };
|
| +
|
| + const GrTextureParams& params = textureAccess.getParams();
|
| +
|
| + VkSamplerCreateInfo createInfo;
|
| + memset(&createInfo, 0, sizeof(VkSamplerCreateInfo));
|
| + createInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
|
| + createInfo.pNext = 0;
|
| + createInfo.flags = 0;
|
| + createInfo.magFilter = vkMagFilterModes[params.filterMode()];
|
| + createInfo.minFilter = vkMinFilterModes[params.filterMode()];
|
| + createInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
|
| + createInfo.addressModeU = tile_to_vk_sampler_address(params.getTileModeX());
|
| + createInfo.addressModeV = tile_to_vk_sampler_address(params.getTileModeY());
|
| + createInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE; // Shouldn't matter
|
| + createInfo.mipLodBias = 0.0f;
|
| + createInfo.anisotropyEnable = VK_FALSE;
|
| + createInfo.maxAnisotropy = 1.0f;
|
| + createInfo.compareEnable = VK_FALSE;
|
| + createInfo.compareOp = VK_COMPARE_OP_NEVER;
|
| + createInfo.minLod = 0.0f;
|
| + createInfo.maxLod = 0.0f;
|
| + createInfo.borderColor = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
|
| + createInfo.unnormalizedCoordinates = VK_FALSE;
|
| +
|
| + VkSampler sampler;
|
| + GR_VK_CALL_ERRCHECK(gpu->vkInterface(), CreateSampler(gpu->device(),
|
| + &createInfo,
|
| + nullptr,
|
| + &sampler));
|
| +
|
| + return new GrVkSampler(sampler);
|
| +}
|
| +
|
| +void GrVkSampler::freeGPUData(const GrVkGpu* gpu) const {
|
| + SkASSERT(fSampler);
|
| + GR_VK_CALL(gpu->vkInterface(), DestroySampler(gpu->device(), fSampler, nullptr));
|
| +}
|
|
|