14 #ifndef hifi_gpu_vk_VKTexture_h
15 #define hifi_gpu_vk_VKTexture_h
19 #include "VKBackend.h"
22 namespace gpu {
namespace vk {
29 class VKTexture :
public VKObject<Texture> {
130 virtual ~VKTexture();
132 VkImage _vkImage{ VK_NULL_HANDLE };
133 const Stamp _storageStamp;
134 const VkImageViewType _target;
138 Stamp _contentStamp { 0 };
139 const bool _transferable;
140 Size _transferCount { 0 };
142 struct DownsampleSource {
143 using Pointer = std::shared_ptr<DownsampleSource>;
144 DownsampleSource(
const std::weak_ptr<VKBackend>& backend) : _backend(backend), _size(0), _texture(VK_NULL_HANDLE), _minMip(0), _maxMip(0) {}
145 DownsampleSource(
const std::weak_ptr<VKBackend>& backend, VKTexture* originalTexture) : _backend(backend), _size(0), _texture(0), _minMip(0), _maxMip(0) { Q_ASSERT(
false); };
146 ~DownsampleSource() {};
147 void reset() { _texture = VK_NULL_HANDLE; }
148 const std::weak_ptr<vk::VKBackend>& _backend;
149 const Size _size { 0 };
151 VkImage _texture { VK_NULL_HANDLE };
152 const uint16 _minMip { 0 };
153 const uint16 _maxMip { 0 };
156 virtual size_t size()
const {
return _size; }
157 VKSyncState getSyncState()
const {
return _syncState; }
161 bool isInvalid()
const {
return false; };
165 bool isOutdated()
const {
return false; };
168 bool isReady()
const {
170 return _syncState == VKSyncState::Transferred;
174 virtual void postTransfer(VKBackend &backend) = 0;
177 bool isOverMaxMemory()
const {
return false; };
180 static const size_t CUBE_NUM_FACES = 6;
184 static const VKFilterMode FILTER_MODES[Sampler::NUM_FILTERS];
185 static const uint32_t WRAP_MODES[Sampler::NUM_WRAP_MODES];
189 static VkImageViewType getVKTextureType(
const Texture& texture);
195 static float getMemoryPressure() {
return 0; };
198 const size_t _size { 0 };
199 std::atomic<VKSyncState> _syncState { VKSyncState::Idle };
200 VkFormat _vkTexelFormat { VK_FORMAT_UNDEFINED };
202 VKTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture,
bool isTransferable);
206 void setSyncState(VKSyncState syncState) { _syncState = syncState; }
209 virtual void createTexture(VKBackend &backend) = 0;
210 virtual VkDescriptorImageInfo getDescriptorImageInfo() = 0;
214 struct TransferData {
224 bool needsAddingAlpha;
226 std::shared_ptr<const storage::Storage> data;
228 std::vector<std::vector<Mip>> mips;
230 TransferData _transferData{};
231 virtual void transfer(VKBackend &backend) = 0;
239 void setSize(
size_t size)
const;
243 VKTexture(
const std::weak_ptr<VKBackend>& backend,
const gpu::Texture& gpuTexture, VkImage image, VKTexture* originalTexture,
bool transferrable);
245 friend class VKTextureTransferHelper;
246 friend class VKBackend;
249 class VKFixedAllocationTexture :
public VKTexture {
250 using Parent = VKTexture;
251 friend class VKBackend;
254 VKFixedAllocationTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture,
bool isTransferable) :
255 VKTexture(backend, texture, isTransferable) {};
256 virtual ~VKFixedAllocationTexture() {};
259 Size size()
const override {
return _size; }
266 VmaAllocation _vmaAllocation;
267 const Size _size{ 0 };
270 class VKAttachmentTexture :
public VKFixedAllocationTexture {
271 friend class VKBackend;
272 friend class VKFramebuffer;
275 VkImageLayout getVkImageLayout() {
return _vkImageLayout; };
278 VKAttachmentTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
279 VKFixedAllocationTexture(backend, texture, false) {
280 VKAttachmentTexture::createTexture(*backend.lock());
282 virtual ~VKAttachmentTexture();
283 void createTexture(VKBackend &backend)
override;
284 void transfer(VKBackend &backend)
override {};
285 void postTransfer(VKBackend &backend)
override {};
287 VkDescriptorImageInfo getDescriptorImageInfo()
override;
289 VkImageView _vkImageView { VK_NULL_HANDLE };
290 VkImageLayout _vkImageLayout {};
291 VkSampler _vkSampler { VK_NULL_HANDLE };
294 class VKStrictResourceTexture:
public VKFixedAllocationTexture {
295 friend class VKBackend;
299 VKStrictResourceTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
300 VKFixedAllocationTexture(backend, texture, true) {
301 VKBackend& vkBackend = *backend.lock();
302 VKStrictResourceTexture::createTexture(vkBackend);
304 VKStrictResourceTexture::transfer(vkBackend);
305 VKStrictResourceTexture::postTransfer(vkBackend);
307 ~VKStrictResourceTexture()
override;
308 void createTexture(VKBackend &backend)
override;
309 void transfer(VKBackend &backend)
override;
310 void postTransfer(VKBackend &backend)
override;
311 VkDescriptorImageInfo getDescriptorImageInfo()
override;
313 VkImageView _vkImageView { VK_NULL_HANDLE };
314 VkImageLayout _vkImageLayout {};
315 VkSampler _vkSampler { VK_NULL_HANDLE };
320 class VKExternalTexture:
public VKTexture {
321 friend class VKBackend;
324 VKExternalTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
325 VKTexture(backend, texture, false) {
326 VKBackend& vkBackend = *backend.lock();
327 VKExternalTexture::createTexture(vkBackend);
329 VKExternalTexture::initGL(vkBackend);
331 VKExternalTexture::postTransfer(vkBackend);
333 ~VKExternalTexture()
override;
334 void releaseExternalTexture();
335 void setSource(GLuint source);
336 void transferGL(VKBackend &backend);
339 Size size()
const override {
return _size; }
342 VkDeviceMemory _sharedMemory;
343 size_t _sharedMemorySize;
344 const Size _size{ 0 };
346 void createTexture(VKBackend &backend)
override;
347 void initGL(VKBackend &backend);
348 void transfer(VKBackend &backend)
override {};
349 void postTransfer(VKBackend &backend)
override;
350 VkDescriptorImageInfo getDescriptorImageInfo()
override;
351 VkImageView _vkImageView { VK_NULL_HANDLE };
352 VkImageLayout _vkImageLayout {};
353 VkSampler _vkSampler { VK_NULL_HANDLE };
357 HANDLE _sharedHandle {
nullptr };
359 int _sharedFd { -1 };
361 GLuint _openGLMemoryObject = 0;
362 GLuint _openGLId = 0;
363 GLuint _openGLSourceId = 0;
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39