blob: ff3727d89417940d5e62e85ac49ae0c0ebb82943 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrVkSampler_DEFINED
#define GrVkSampler_DEFINED
#include "include/gpu/vk/GrVkTypes.h"
#include "src/core/SkOpts.h"
#include "src/gpu/vk/GrVkManagedResource.h"
#include "src/gpu/vk/GrVkSamplerYcbcrConversion.h"
#include <atomic>
#include <cinttypes>
class GrSamplerState;
class GrVkGpu;
class GrVkSampler : public GrVkManagedResource {
public:
static GrVkSampler* Create(GrVkGpu* gpu, GrSamplerState, const GrVkYcbcrConversionInfo&);
VkSampler sampler() const { return fSampler; }
const VkSampler* samplerPtr() const { return &fSampler; }
struct Key {
Key(uint8_t samplerKey, const GrVkSamplerYcbcrConversion::Key& ycbcrKey) {
// We must memset here since the GrVkSamplerYcbcrConversion has a 64 bit value which may
// force alignment padding to occur in the middle of the Key struct.
memset(this, 0, sizeof(Key));
fSamplerKey = samplerKey;
fYcbcrKey = ycbcrKey;
}
uint8_t fSamplerKey;
GrVkSamplerYcbcrConversion::Key fYcbcrKey;
bool operator==(const Key& that) const {
return this->fSamplerKey == that.fSamplerKey &&
this->fYcbcrKey == that.fYcbcrKey;
}
};
// Helpers for hashing GrVkSampler
static Key GenerateKey(GrSamplerState, const GrVkYcbcrConversionInfo&);
static const Key& GetKey(const GrVkSampler& sampler) { return sampler.fKey; }
static uint32_t Hash(const Key& key) {
return SkOpts::hash(reinterpret_cast<const uint32_t*>(&key), sizeof(Key));
}
uint32_t uniqueID() const { return fUniqueID; }
#ifdef SK_TRACE_MANAGED_RESOURCES
void dumpInfo() const override {
SkDebugf("GrVkSampler: %" PRIdPTR " (%d refs)\n", (intptr_t)fSampler, this->getRefCnt());
}
#endif
private:
GrVkSampler(const GrVkGpu* gpu, VkSampler sampler,
GrVkSamplerYcbcrConversion* ycbcrConversion, Key key)
: INHERITED(gpu)
, fSampler(sampler)
, fYcbcrConversion(ycbcrConversion)
, fKey(key)
, fUniqueID(GenID()) {}
void freeGPUData() const override;
static uint32_t GenID() {
static std::atomic<uint32_t> nextID{1};
uint32_t id;
do {
id = nextID++;
} while (id == SK_InvalidUniqueID);
return id;
}
VkSampler fSampler;
GrVkSamplerYcbcrConversion* fYcbcrConversion;
Key fKey;
uint32_t fUniqueID;
using INHERITED = GrVkManagedResource;
};
#endif