//
// Copyright 2021 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// CLSamplerVk.h: Defines the class interface for CLSamplerVk, implementing CLSamplerImpl.

#ifndef LIBANGLE_RENDERER_VULKAN_CLSAMPLERVK_H_
#define LIBANGLE_RENDERER_VULKAN_CLSAMPLERVK_H_

#include "libANGLE/renderer/vulkan/cl_types.h"
#include "libANGLE/renderer/vulkan/vk_cache_utils.h"

#include "libANGLE/renderer/CLSamplerImpl.h"

#include "vulkan/vulkan_core.h"

namespace rx
{

class CLSamplerVk : public CLSamplerImpl
{
  public:
    CLSamplerVk(const cl::Sampler &sampler);
    ~CLSamplerVk() override;

    vk::SamplerHelper &getSamplerHelper() { return mSamplerHelper; }
    vk::SamplerHelper &getSamplerHelperNormalized() { return mSamplerHelperNormalized; }
    angle::Result create();
    angle::Result createNormalized();

    VkSamplerAddressMode getVkAddressMode();
    VkFilter getVkFilter();
    VkSamplerMipmapMode getVkMipmapMode();
    uint32_t getSamplerMask();

  private:
    CLContextVk *mContext;
    vk::Renderer *mRenderer;

    vk::SamplerHelper mSamplerHelper;
    vk::SamplerHelper mSamplerHelperNormalized;
    VkSamplerCreateInfo mDefaultSamplerCreateInfo;
};

}  // namespace rx

#endif  // LIBANGLE_RENDERER_VULKAN_CLSAMPLERVK_H_
