14 #ifndef hifi_gpu_vk_VKTexture_h
15 #define hifi_gpu_vk_VKTexture_h
19 #include "VKBackend.h"
20 #include "VKTextureTransfer.h"
22 namespace gpu {
namespace vk {
29 class VKTexture :
public VKObject<Texture> {
123 virtual ~VKTexture();
125 VkImage _vkImage{ VK_NULL_HANDLE };
126 const Stamp _storageStamp;
127 const VkImageViewType _target;
131 Stamp _contentStamp { 0 };
132 const bool _transferable;
133 Size _transferCount { 0 };
135 struct DownsampleSource {
136 using Pointer = std::shared_ptr<DownsampleSource>;
137 DownsampleSource(
const std::weak_ptr<VKBackend>& backend) : _backend(backend), _size(0), _texture(VK_NULL_HANDLE), _minMip(0), _maxMip(0) {}
138 DownsampleSource(
const std::weak_ptr<VKBackend>& backend, VKTexture* originalTexture) : _backend(backend), _size(0), _texture(0), _minMip(0), _maxMip(0) { Q_ASSERT(
false); };
139 ~DownsampleSource() {};
140 void reset() { _texture = VK_NULL_HANDLE; }
141 const std::weak_ptr<vk::VKBackend>& _backend;
142 const Size _size { 0 };
144 VkImage _texture { VK_NULL_HANDLE };
145 const uint16 _minMip { 0 };
146 const uint16 _maxMip { 0 };
149 virtual size_t size()
const { Q_ASSERT(
false);
return 0; }
150 VKSyncState getSyncState()
const {
return _syncState; }
154 bool isInvalid()
const {
return false; };
158 bool isOutdated()
const {
return false; };
161 bool isReady()
const {
163 return _syncState == VKSyncState::Transferred;
167 virtual void postTransfer(VKBackend &backend) = 0;
170 bool isOverMaxMemory()
const {
return false; };
172 static uint8_t getFaceCount(VkImageViewType target);
175 static const size_t CUBE_NUM_FACES = 6;
179 static const VKFilterMode FILTER_MODES[Sampler::NUM_FILTERS];
180 static const uint32_t WRAP_MODES[Sampler::NUM_WRAP_MODES];
184 static VkImageViewType getVKTextureType(
const Texture& texture);
190 static float getMemoryPressure() {
return 0; };
194 std::atomic<VKSyncState> _syncState { VKSyncState::Idle };
195 VkFormat _vkTexelFormat { VK_FORMAT_UNDEFINED };
197 VKTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture,
bool isTransferable);
201 void setSyncState(VKSyncState syncState) { _syncState = syncState; }
204 virtual void createTexture(VKBackend &backend) = 0;
205 virtual VkDescriptorImageInfo getDescriptorImageInfo() = 0;
209 struct TransferData {
219 bool needsAddingAlpha;
221 std::shared_ptr<const storage::Storage> data;
223 std::vector<std::vector<Mip>> mips;
225 virtual void transfer(VKBackend &backend) = 0;
226 virtual void syncSampler(
const Sampler& sampler) = 0;
232 static Sampler getInvalidSampler();
235 mutable Sampler _cachedSampler { getInvalidSampler() };
238 void setSize(
size_t size)
const;
242 VKTexture(
const std::weak_ptr<VKBackend>& backend,
const gpu::Texture& gpuTexture, VkImage image, VKTexture* originalTexture,
bool transferrable);
244 friend class VKTextureTransferHelper;
245 friend class VKBackend;
248 class VKFixedAllocationTexture :
public VKTexture {
249 using Parent = VKTexture;
250 friend class VKBackend;
253 VKFixedAllocationTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture,
bool isTransferable) :
254 VKTexture(backend, texture, isTransferable) {};
255 virtual ~VKFixedAllocationTexture() {};
258 Size size()
const override { Q_ASSERT(
false);
return 0; }
262 void syncSampler(
const Sampler& sampler)
override {};
265 VmaAllocation _vmaAllocation;
269 class VKAttachmentTexture :
public VKFixedAllocationTexture {
270 friend class VKBackend;
271 friend class VKFramebuffer;
274 VkImageLayout getVkImageLayout() {
return _vkImageLayout; };
277 VKAttachmentTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
278 VKFixedAllocationTexture(backend, texture, false) {
279 VKAttachmentTexture::createTexture(*backend.lock());
281 virtual ~VKAttachmentTexture();
282 void createTexture(VKBackend &backend)
override;
283 void transfer(VKBackend &backend)
override {};
284 void postTransfer(VKBackend &backend)
override {};
286 VkDescriptorImageInfo getDescriptorImageInfo()
override;
288 VkImageView _vkImageView { VK_NULL_HANDLE };
289 VkImageLayout _vkImageLayout {};
290 VkSampler _vkSampler { VK_NULL_HANDLE };
293 class VKStrictResourceTexture:
public VKFixedAllocationTexture {
294 friend class VKBackend;
296 void postTransfer(VKBackend &backend)
override;
300 VKStrictResourceTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
301 VKFixedAllocationTexture(backend, texture, true) {
302 VKBackend& vkBackend = *backend.lock();
303 VKStrictResourceTexture::createTexture(vkBackend);
305 VKStrictResourceTexture::transfer(vkBackend);
306 VKStrictResourceTexture::postTransfer(vkBackend);
308 ~VKStrictResourceTexture()
override;
309 void createTexture(VKBackend &backend)
override;
310 void transfer(VKBackend &backend)
override;
311 VkDescriptorImageInfo getDescriptorImageInfo()
override;
312 TransferData _transferData{};
314 VkImageView _vkImageView { VK_NULL_HANDLE };
315 VkImageLayout _vkImageLayout {};
316 VkSampler _vkSampler { VK_NULL_HANDLE };
321 class VKVariableAllocationTexture :
public VKTexture,
public VKVariableAllocationSupport {
322 using Parent = VKTexture;
323 friend class VKBackend;
324 using PromoteLambda = std::function<void()>;
327 VKVariableAllocationTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture);
328 ~VKVariableAllocationTexture()
override;
330 void allocateNewImage(uint16_t targetAllocatedMip, VkCommandBuffer ©Cmd);
332 Size size()
const override {
return _size; }
334 void syncSampler(
const Sampler& sampler)
override {};
336 void copyTextureMipsInGPUMem(VkImage srcImage, VkImage dstImage,
337 uint16_t srcMipOffset, uint16_t destMipOffset, uint16_t populatedMips, VkCommandBuffer ©Cmd);
339 VmaAllocation _vmaAllocation;
341 #if GPU_BINDLESS_TEXTURES
342 virtual const Bindless& getBindless()
const override;
346 class VKResourceTexture :
public VKVariableAllocationTexture {
347 using Parent = VKVariableAllocationTexture;
348 friend class VKBackend;
350 size_t promote()
override;
351 size_t demote()
override;
352 void populateTransferQueue(TransferQueue& pendingTransfers)
override;
354 void postTransfer(VKBackend &backend)
override;
357 VKResourceTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture);
359 void syncSampler(
const Sampler& sampler)
override;
360 void updateImageView();
362 void createTexture(VKBackend &backend)
override {};
363 void transfer(VKBackend &backend)
override {};
365 VkDescriptorImageInfo getDescriptorImageInfo()
override;
368 Size copyMipsFromTexture(VkCommandBuffer ©Cmd);
369 Size copyMipFaceFromTexture(uint16_t sourceMip, uint16_t targetMip, uint8_t face, VkCommandBuffer ©Cmd);
370 Size copyMipFaceLinesFromTexture(uint16_t mip, uint8_t face,
371 const uvec3& size, uint32_t yOffset,
372 Size sourceSize,
const void* sourcePointer);
374 VkImageView _vkImageView { VK_NULL_HANDLE };
375 VkImageLayout _vkImageLayout {};
376 VkSampler _vkSampler { VK_NULL_HANDLE };
377 friend class TransferJob;
381 class VKExternalTexture:
public VKTexture {
382 friend class VKBackend;
385 VKExternalTexture(
const std::weak_ptr<VKBackend>& backend,
const Texture& texture) :
386 VKTexture(backend, texture, false) {
387 VKBackend& vkBackend = *backend.lock();
388 VKExternalTexture::createTexture(vkBackend);
390 VKExternalTexture::initGL(vkBackend);
392 VKExternalTexture::postTransfer(vkBackend);
394 ~VKExternalTexture()
override;
395 void releaseExternalTexture();
396 void setSource(GLuint source);
397 void transferGL(VKBackend &backend);
400 Size size()
const override {
return _size; }
402 void syncSampler(
const Sampler& sampler)
override {};
405 VkDeviceMemory _sharedMemory;
406 size_t _sharedMemorySize;
407 const Size _size{ 0 };
409 void createTexture(VKBackend &backend)
override;
410 void initGL(VKBackend &backend);
411 void transfer(VKBackend &backend)
override {};
412 void postTransfer(VKBackend &backend)
override;
413 VkDescriptorImageInfo getDescriptorImageInfo()
override;
414 VkImageView _vkImageView { VK_NULL_HANDLE };
415 VkImageLayout _vkImageLayout {};
416 VkSampler _vkSampler { VK_NULL_HANDLE };
420 HANDLE _sharedHandle {
nullptr };
422 int _sharedFd { -1 };
424 GLuint _openGLMemoryObject = 0;
425 GLuint _openGLId = 0;
426 GLuint _openGLSourceId = 0;
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39