OGRE  2.3
Object-Oriented Graphics Rendering Engine
Ogre::TextureGpu Class Referenceabstract

#include <OgreTextureGpu.h>

+ Inheritance diagram for Ogre::TextureGpu:

Public Member Functions

 TextureGpu (GpuPageOutStrategy::GpuPageOutStrategy pageOutStrategy, VaoManager *vaoManager, IdString name, uint32 textureFlags, TextureTypes::TextureTypes initialType, TextureGpuManager *textureManager)
 
virtual ~TextureGpu ()
 
void _addPendingResidencyChanges (uint32 value)
 
virtual void _autogenerateMipmaps (CopyEncTransitionMode::CopyEncTransitionMode transitionMode=CopyEncTransitionMode::Auto)=0
 Tells the API to let the HW autogenerate mipmaps. More...
 
uint8_getSysRamCopy (uint8 mipLevel)
 
TextureBox _getSysRamCopyAsBox (uint8 mipLevel)
 
size_t _getSysRamCopyBytesPerImage (uint8 mipLevel)
 Note: Returns non-zero even if there is no system ram copy. More...
 
size_t _getSysRamCopyBytesPerRow (uint8 mipLevel)
 Note: Returns non-zero even if there is no system ram copy. More...
 
virtual bool _isDataReadyImpl (void) const =0
 For internal use. More...
 
bool _isManualTextureFlagPresent (void) const
 
void _notifySysRamDownloadIsReady (uint8 *sysRamPtr, bool resyncOnly)
 Do not call directly. More...
 
virtual void _notifyTextureSlotChanged (const TexturePool *newPool, uint16 slice)
 
void _resetTextureManager (void)
 
void _resolveTo (TextureGpu *resolveTexture)
 Immediately resolves this texture to the resolveTexture argument. More...
 
virtual void _setDepthBufferDefaults (uint16 depthBufferPoolId, bool preferDepthTexture, PixelFormatGpu desiredDepthBufferFormat)
 These 3 values are used as defaults for the compositor to use, but they may be explicitly overriden by a RenderPassDescriptor. More...
 
virtual void _setNextLayout (ResourceLayout::Layout layout)
 Sets the layout the texture should be transitioned to after the next copy operation (once the copy encoder gets closed) More...
 
void _setNextResidencyStatus (GpuResidency::GpuResidency nextResidency)
 
void _setSampleDescription (SampleDescription desc, SampleDescription validatedSampleDesc)
 For internal use. More...
 
void _setSourceType (uint8 type)
 
virtual void _setToDisplayDummyTexture (void)=0
 
void _syncGpuResidentToSystemRam (void)
 Forces downloading data from GPU to CPU, usually because the data on GPU changed and we're in strategy AlwaysKeepSystemRamCopy. More...
 
void _transitionTo (GpuResidency::GpuResidency newResidency, uint8 *sysRamCopy, bool autoDeleteSysRamCopy=true)
 This function may be called manually (if user is manually managing a texture) or automatically (e.g. More...
 
void addListener (TextureGpuListener *listener)
 
bool allowsAutoMipmaps (void) const
 
void copyContentsToMemory (TextureBox src, TextureBox dst, PixelFormatGpu dstFormat, bool automaticResolve=true)
 Writes the current contents of the render target to the memory. More...
 
void copyParametersFrom (TextureGpu *src)
 
virtual void copyTo (TextureGpu *dst, const TextureBox &dstBox, uint8 dstMipLevel, const TextureBox &srcBox, uint8 srcMipLevel, bool keepResolvedTexSynced=true, CopyEncTransitionMode::CopyEncTransitionMode srcTransitionMode=CopyEncTransitionMode::Auto, CopyEncTransitionMode::CopyEncTransitionMode dstTransitionMode=CopyEncTransitionMode::Auto)
 
virtual ResourceLayout::Layout getCurrentLayout (void) const
 
virtual void getCustomAttribute (IdString name, void *pData)
 
ResourceLayout::Layout getDefaultLayout (bool bIgnoreDiscardableFlag=false) const
 
uint32 getDepth (void) const
 For TypeCube & TypeCubeArray, this value returns 1. More...
 
virtual uint16 getDepthBufferPoolId (void) const
 
uint32 getDepthOrSlices (void) const
 
virtual PixelFormatGpu getDesiredDepthBufferFormat (void) const
 
TextureBox getEmptyBox (uint8 mipLevel)
 
GpuPageOutStrategy::GpuPageOutStrategy getGpuPageOutStrategy (void) const
 
uint32 getHeight (void) const
 
uint32 getInternalHeight (void) const
 Real API height accounting for TextureGpu::getOrientationMode. See getInternalWidth. More...
 
uint32 getInternalSliceStart (void) const
 
TextureTypes::TextureTypes getInternalTextureType (void) const
 
uint32 getInternalWidth (void) const
 Real API width accounting for TextureGpu::getOrientationMode If orientation mode is 90° or 270° then getInternalWidth returns the height and getInternalHeight returns the width. More...
 
const vector< TextureGpuListener * >::type & getListeners (void) const
 
IdString getName (void) const
 
virtual String getNameStr (void) const
 Note: This returns the alias name of the texture. More...
 
GpuResidency::GpuResidency getNextResidencyStatus (void) const
 When getResidencyStatus() != getNextResidencyStatus(), residency changes happen in the main thread, while some preparation may be happening in the background. More...
 
uint8 getNumMipmaps (void) const
 
uint32 getNumSlices (void) const
 For TypeCube this value returns 6. More...
 
virtual OrientationMode getOrientationMode (void) const
 
uint32 getPendingResidencyChanges (void) const
 Returns the number of pending residency changes. More...
 
PixelFormatGpu getPixelFormat (void) const
 
virtual bool getPreferDepthTexture (void) const
 
virtual String getRealResourceNameStr (void) const
 Returns the real name (e.g. disk in file) of the resource. More...
 
SampleDescription getRequestedSampleDescription (void) const
 Returns original requested sample description, i.e. the raw input to setSampleDescription. More...
 
GpuResidency::GpuResidency getResidencyStatus (void) const
 
virtual String getResourceGroupStr (void) const
 
SampleDescription getSampleDescription (void) const
 Returns effective sample description supported by the API. More...
 
String getSettingsDesc (void) const
 
size_t getSizeBytes (void) const
 Returns total size in bytes used in GPU by this texture (not by its pool) including mipmaps. More...
 
uint8 getSourceType (void) const
 
virtual void getSubsampleLocations (vector< Vector2 >::type locations)=0
 Get the MSAA subsample locations. More...
 
TextureGpuManagergetTextureManager (void) const
 
const TexturePoolgetTexturePool (void) const
 
uint32 getTexturePoolId (void) const
 
TextureTypes::TextureTypes getTextureType (void) const
 
uint32 getWidth (void) const
 
bool hasAutomaticBatching (void) const
 
bool hasAutoMipmapAuto (void) const
 
bool hasEquivalentParameters (TextureGpu *other) const
 
bool hasMsaaExplicitResolves (void) const
 
bool isDataReady (void) const
 True if this texture is fully ready to be used for displaying. More...
 
bool isDiscardableContent (void) const
 
bool isManualTexture (void) const
 
bool isMetadataReady (void) const
 It is threadsafe to call this function from main thread. More...
 
virtual bool isMsaaPatternSupported (MsaaPatterns::MsaaPatterns pattern)
 
bool isMultisample (void) const
 
virtual bool isOpenGLRenderWindow (void) const
 OpenGL RenderWindows are a bit specific: More...
 
bool isPoolOwner (void) const
 
bool isReinterpretable (void) const
 
bool isRenderToTexture (void) const
 
bool isRenderWindowSpecific (void) const
 
bool isTexture (void) const
 
virtual bool isTextureGpu (void) const
 
bool isUav (void) const
 
void notifyAllListenersTextureChanged (uint32 reason, void *extraData=0)
 
virtual void notifyDataIsReady (void)=0
 Notifies it is safe to use the real data. Everything has been uploaded. More...
 
void operator delete (void *ptr)
 
void operator delete (void *ptr, const char *, int, const char *)
 
void operator delete (void *ptr, void *)
 
void operator delete[] (void *ptr)
 
void operator delete[] (void *ptr, const char *, int, const char *)
 
void * operator new (size_t sz)
 
void * operator new (size_t sz, const char *file, int line, const char *func)
 operator new, with debug line info More...
 
void * operator new (size_t sz, void *ptr)
 placement operator new More...
 
void * operator new[] (size_t sz)
 
void * operator new[] (size_t sz, const char *file, int line, const char *func)
 array operator new, with debug line info More...
 
bool prefersLoadingFromFileAsSRGB (void) const
 
void removeListener (TextureGpuListener *listener)
 
bool requiresTextureFlipping (void) const
 
void scheduleReupload (Image2 *image=0, bool autoDeleteImage=true)
 There are times where you want to reload a texture again (e.g. More...
 
void scheduleTransitionTo (GpuResidency::GpuResidency nextResidency, Image2 *image=0, bool autoDeleteImage=true)
 Same as unsafeScheduleTransitionTo, but first checks if we're already in the residency state we want to go to, or if it has already been scheduled; thus it can be called multiple times. More...
 
void setNumMipmaps (uint8 numMipmaps)
 
virtual void setOrientationMode (OrientationMode orientationMode)
 Sets the given orientation. More...
 
void setPixelFormat (PixelFormatGpu pixelFormat)
 Sets the pixel format. More...
 
void setResolution (uint32 width, uint32 height, uint32 depthOrSlices=1u)
 
void setSampleDescription (SampleDescription desc)
 
void setTexturePoolId (uint32 poolId)
 2D Texture with automatic batching will be merged with other textures into the same pool as one big 2D Array texture behind the scenes. More...
 
virtual void setTextureType (TextureTypes::TextureTypes textureType)
 
virtual bool supportsAsDepthBufferFor (TextureGpu *colourTarget) const
 
virtual void swapBuffers (void)
 Only valid for TextureGpu classes. More...
 
void unsafeScheduleTransitionTo (GpuResidency::GpuResidency nextResidency, Image2 *image=0, bool autoDeleteImage=true)
 Schedules an async transition in residency. More...
 
void waitForData (void)
 Blocks main thread until data is ready. More...
 
void waitForMetadata (void)
 Blocks main thread until metadata is ready. More...
 
void writeContentsToFile (const String &filename, uint8 minMip, uint8 maxMip, bool automaticResolve=true)
 Writes the current contents of the render target to the named file. More...
 

Static Public Attributes

static OrientationMode msDefaultOrientationMode
 PUBLIC VARIABLE. More...
 
static const IdString msFinalTextureBuffer
 
static const IdString msMsaaTextureBuffer
 

Detailed Description

Remarks
Internal layout of data in memory:
        Mip0 -> Slice 0, Slice 1, ..., Slice N
        Mip1 -> Slice 0, Slice 1, ..., Slice N
        ...
        MipN -> Slice 0, Slice 1, ..., Slice N

The layout for 3D volume and array textures is the same. The only thing that changes is that for 3D volumes, the number of slices also decreases with each mip, while for array textures it is kept constant.

For 1D array textures, the number of slices is stored in mDepthOrSlices, not in Height.

For code reference, look at _getSysRamCopyAsBox implementation, and TextureBox::at Each row of pixels is aligned to 4 bytes (except for compressed formats that require more strict alignments, such as alignment to the block).

A TextureGpu loaded from file has the following life cycle, usually:

  1. At creation it's mResidencyStatus = GpuResidency::OnStorage
  2. Loading is scheduled via scheduleTransitionTo. mNextResidencyStatus = GpuResidency::Resident
  3. Texture transitions to resident. mResidencyStatus = GpuResidency::Resident isMetadataReady returns true. How fast this happens depends on whether there was a metadata cache or not.
  4. If there is a metadata cache, and the cache turned out to be wrong (e.g. it lied or was out of date), the texture will transition back to OnStorage and the whole process repeats from step 1.
  5. Texture finishes loading. notifyDataIsReady gets called and now isDataReady returns true.

Constructor & Destructor Documentation

◆ TextureGpu()

Ogre::TextureGpu::TextureGpu ( GpuPageOutStrategy::GpuPageOutStrategy  pageOutStrategy,
VaoManager vaoManager,
IdString  name,
uint32  textureFlags,
TextureTypes::TextureTypes  initialType,
TextureGpuManager textureManager 
)

◆ ~TextureGpu()

virtual Ogre::TextureGpu::~TextureGpu ( )
virtual

Member Function Documentation

◆ _addPendingResidencyChanges()

void Ogre::GpuResource::_addPendingResidencyChanges ( uint32  value)
inherited

◆ _autogenerateMipmaps()

virtual void Ogre::TextureGpu::_autogenerateMipmaps ( CopyEncTransitionMode::CopyEncTransitionMode  transitionMode = CopyEncTransitionMode::Auto)
pure virtual

Tells the API to let the HW autogenerate mipmaps.

Assumes allowsAutoMipmaps() == true and isRenderToTexture() == true

Parameters
transitionModeSee CopyEncTransitionMode::CopyEncTransitionMode

Implemented in Ogre::VulkanTextureGpu, Ogre::NULLTextureGpu, Ogre::MetalTextureGpu, Ogre::GL3PlusTextureGpu, and Ogre::D3D11TextureGpu.

◆ _getSysRamCopy()

uint8* Ogre::TextureGpu::_getSysRamCopy ( uint8  mipLevel)

◆ _getSysRamCopyAsBox()

TextureBox Ogre::TextureGpu::_getSysRamCopyAsBox ( uint8  mipLevel)

◆ _getSysRamCopyBytesPerImage()

size_t Ogre::TextureGpu::_getSysRamCopyBytesPerImage ( uint8  mipLevel)

Note: Returns non-zero even if there is no system ram copy.

◆ _getSysRamCopyBytesPerRow()

size_t Ogre::TextureGpu::_getSysRamCopyBytesPerRow ( uint8  mipLevel)

Note: Returns non-zero even if there is no system ram copy.

◆ _isDataReadyImpl()

virtual bool Ogre::TextureGpu::_isDataReadyImpl ( void  ) const
pure virtual

For internal use.

Do not call directly.

This function is the same isDataReady except it ignores pending residency changes, which is important when TextureGpuManager needs to know this information but the TextureGpu is transitioning (thus mPendingResidencyChanges is in an inconsistent state)

Implemented in Ogre::VulkanTextureGpuWindow, Ogre::VulkanTextureGpu, Ogre::NULLTextureGpu, Ogre::MetalTextureGpuWindow, Ogre::MetalTextureGpu, Ogre::GL3PlusTextureGpuWindow, Ogre::GL3PlusTextureGpu, Ogre::D3D11TextureGpuWindow, and Ogre::D3D11TextureGpu.

◆ _isManualTextureFlagPresent()

bool Ogre::TextureGpu::_isManualTextureFlagPresent ( void  ) const

◆ _notifySysRamDownloadIsReady()

void Ogre::TextureGpu::_notifySysRamDownloadIsReady ( uint8 sysRamPtr,
bool  resyncOnly 
)

Do not call directly.

Will change mResidencyStatus from GpuResidency::Resident to GpuResidency::OnSystemRam

◆ _notifyTextureSlotChanged()

◆ _resetTextureManager()

void Ogre::TextureGpu::_resetTextureManager ( void  )

◆ _resolveTo()

void Ogre::TextureGpu::_resolveTo ( TextureGpu resolveTexture)

Immediately resolves this texture to the resolveTexture argument.

Source must be MSAA texture, destination must be non-MSAA.

Remarks
This function may be slow on some APIs and should only be used when required, for example, to capture the screen from an explicit MSAA target and save it to disk only on user demand. If you need to call this often (like once per frame or more), then consider setting a Compositor with CompositorNode::mLocalRtvs::resolveTextureName set so that the compositor automatically resolves the texture every frame as efficiently as possible.

◆ _setDepthBufferDefaults()

virtual void Ogre::TextureGpu::_setDepthBufferDefaults ( uint16  depthBufferPoolId,
bool  preferDepthTexture,
PixelFormatGpu  desiredDepthBufferFormat 
)
virtual

These 3 values are used as defaults for the compositor to use, but they may be explicitly overriden by a RenderPassDescriptor.

Particularly required when passing the textures between nodes as input and output (since only the TextureGpu pointer is passed, and thus this information is lost)

Remarks
Changing these settings won't take immediate effect because they're only used when creating the compositor.
Parameters
depthBufferPoolIdSets the pool ID this RenderTarget should query from. Default value is POOL_DEFAULT. Set to POOL_NO_DEPTH to avoid using a DepthBuffer (or manually controlling it)
preferDepthTextureWhether this RT should be attached to a depth texture, or a regular depth buffer. On older GPUs, preferring depth textures may result in certain depth precisions to not be available (or use integer precision instead of floating point, etc). True to use depth textures. False otherwise (default).
desiredDepthBufferFormatOgre will try to honour this request, but if it's not supported, you may get lower precision. All formats will try to fallback to PF_D24_UNORM_S8_UINT if not supported. Must be one of the following: PFG_D24_UNORM_S8_UINT PFG_D16_UNORM PFG_D32_FLOAT PFG_D32_FLOAT_X24_S8_UINT

Reimplemented in Ogre::VulkanTextureGpuRenderTarget, Ogre::NULLTextureGpuRenderTarget, Ogre::MetalTextureGpuRenderTarget, Ogre::GL3PlusTextureGpuRenderTarget, and Ogre::D3D11TextureGpuRenderTarget.

◆ _setNextLayout()

virtual void Ogre::TextureGpu::_setNextLayout ( ResourceLayout::Layout  layout)
virtual

Sets the layout the texture should be transitioned to after the next copy operation (once the copy encoder gets closed)

This is specific to Vulkan & D3D12

Reimplemented in Ogre::VulkanTextureGpu.

◆ _setNextResidencyStatus()

void Ogre::GpuResource::_setNextResidencyStatus ( GpuResidency::GpuResidency  nextResidency)
inherited

◆ _setSampleDescription()

void Ogre::TextureGpu::_setSampleDescription ( SampleDescription  desc,
SampleDescription  validatedSampleDesc 
)

For internal use.

◆ _setSourceType()

void Ogre::TextureGpu::_setSourceType ( uint8  type)

◆ _setToDisplayDummyTexture()

◆ _syncGpuResidentToSystemRam()

void Ogre::TextureGpu::_syncGpuResidentToSystemRam ( void  )

Forces downloading data from GPU to CPU, usually because the data on GPU changed and we're in strategy AlwaysKeepSystemRamCopy.

May stall.

◆ _transitionTo()

void Ogre::TextureGpu::_transitionTo ( GpuResidency::GpuResidency  newResidency,
uint8 sysRamCopy,
bool  autoDeleteSysRamCopy = true 
)

This function may be called manually (if user is manually managing a texture) or automatically (e.g.

loading from file, or automatic batching is enabled) Once you call this function, you're no longer in OnStorage mode; and will transition to either OnSystemRam or Resident depending on whether auto batching is enabled.

Remarks
Do NOT call this function yourself if you've created this function with AutomaticBatching as Ogre will call this, from a worker thread!

Make sure you're done using mSysRamCopy before calling this function, as we may free that pointer (unless autoDeleteSysRamCopyOnResident = false).

If you're calling _transitionTo yourself (i.e. you're not using scheduleTransitionTo) then you'll need to call _setNextResidencyStatus too, so that both getResidencyStatus and getNextResidencyStatus agree.

Parameters
sysRamCopySystem RAM copy that backs this GPU data. May be null. Must've been allocated with OGRE_MALLOC_SIMD( size, MEMCATEGORY_RESOURCE ); We will deallocate it. MUST respect _getSysRamCopyBytesPerRow & _getSysRamCopyBytesPerImage. If in doubt, use PixelFormatGpuUtils::getSizeBytes with rowAlignment = 4u;

This param must be nullptr or equal to get_getSysRamCopy when going from Resident to OnSystemRam and strategy is not AlwaysKeepSystemRamCopy; as we will async download the content from the GPU.

Parameters
autoDeleteSysRamCopyWhen true, we free mSysRamCopy as we should. When false, caller is responsible for deleting this pointer else it will leak!

◆ addListener()

void Ogre::TextureGpu::addListener ( TextureGpuListener listener)

◆ allowsAutoMipmaps()

bool Ogre::TextureGpu::allowsAutoMipmaps ( void  ) const

◆ copyContentsToMemory()

void Ogre::TextureGpu::copyContentsToMemory ( TextureBox  src,
TextureBox  dst,
PixelFormatGpu  dstFormat,
bool  automaticResolve = true 
)

Writes the current contents of the render target to the memory.

◆ copyParametersFrom()

void Ogre::TextureGpu::copyParametersFrom ( TextureGpu src)

◆ copyTo()

virtual void Ogre::TextureGpu::copyTo ( TextureGpu dst,
const TextureBox dstBox,
uint8  dstMipLevel,
const TextureBox srcBox,
uint8  srcMipLevel,
bool  keepResolvedTexSynced = true,
CopyEncTransitionMode::CopyEncTransitionMode  srcTransitionMode = CopyEncTransitionMode::Auto,
CopyEncTransitionMode::CopyEncTransitionMode  dstTransitionMode = CopyEncTransitionMode::Auto 
)
virtual
Parameters
dst
dstBox
dstMipLevel
srcBox
srcMipLevel
keepResolvedTexSyncedWhen true, if dst is an MSAA texture and is implicitly resolved (i.e. dst->hasMsaaExplicitResolves() == false); the resolved texture is also kept up to date.

Typically the reason to set this to false is if you plane on rendering more stuff to dst texture and then resolve.

Parameters
srcTransitionModeTransition mode for 'this'
dstTransitionModeTransition mode for 'dst'

Reimplemented in Ogre::VulkanTextureGpu, Ogre::MetalTextureGpu, Ogre::GL3PlusTextureGpu, and Ogre::D3D11TextureGpu.

◆ getCurrentLayout()

virtual ResourceLayout::Layout Ogre::TextureGpu::getCurrentLayout ( void  ) const
virtual

Reimplemented in Ogre::VulkanTextureGpu.

◆ getCustomAttribute()

◆ getDefaultLayout()

ResourceLayout::Layout Ogre::TextureGpu::getDefaultLayout ( bool  bIgnoreDiscardableFlag = false) const

◆ getDepth()

uint32 Ogre::TextureGpu::getDepth ( void  ) const

For TypeCube & TypeCubeArray, this value returns 1.

◆ getDepthBufferPoolId()

◆ getDepthOrSlices()

uint32 Ogre::TextureGpu::getDepthOrSlices ( void  ) const

◆ getDesiredDepthBufferFormat()

◆ getEmptyBox()

TextureBox Ogre::TextureGpu::getEmptyBox ( uint8  mipLevel)

◆ getGpuPageOutStrategy()

GpuPageOutStrategy::GpuPageOutStrategy Ogre::GpuResource::getGpuPageOutStrategy ( void  ) const
inherited

◆ getHeight()

uint32 Ogre::TextureGpu::getHeight ( void  ) const

◆ getInternalHeight()

uint32 Ogre::TextureGpu::getInternalHeight ( void  ) const

Real API height accounting for TextureGpu::getOrientationMode. See getInternalWidth.

◆ getInternalSliceStart()

uint32 Ogre::TextureGpu::getInternalSliceStart ( void  ) const

◆ getInternalTextureType()

TextureTypes::TextureTypes Ogre::TextureGpu::getInternalTextureType ( void  ) const

◆ getInternalWidth()

uint32 Ogre::TextureGpu::getInternalWidth ( void  ) const

Real API width accounting for TextureGpu::getOrientationMode If orientation mode is 90° or 270° then getInternalWidth returns the height and getInternalHeight returns the width.

◆ getListeners()

const vector<TextureGpuListener*>::type& Ogre::TextureGpu::getListeners ( void  ) const

◆ getName()

IdString Ogre::GpuResource::getName ( void  ) const
inherited

◆ getNameStr()

virtual String Ogre::TextureGpu::getNameStr ( void  ) const
virtual

Note: This returns the alias name of the texture.

See TextureGpuManager::createOrRetrieveTexture

Reimplemented from Ogre::GpuResource.

◆ getNextResidencyStatus()

GpuResidency::GpuResidency Ogre::GpuResource::getNextResidencyStatus ( void  ) const
inherited

When getResidencyStatus() != getNextResidencyStatus(), residency changes happen in the main thread, while some preparation may be happening in the background.

For example when a texture is not resident but getNextResidencyStatus says it will, a background thread is loading the texture file from disk, but the actual transition won't happen until the main thread changes it. You can call texture->waitForData() which will stall, as the main thread will be communicating back and forth with the background to see if it's ready; and when it is, the main thread will perform the transition inside waitForData

Likewise, if that texture is resident but will soon not be, it is still legal to access its contents as long as you access them from the main thread before that main thread changes the residency. This gives you a strong serialization guarantee, but be careful with async tickets such as AsyncTextureTickets:

If you call AsyncTextureTicket *asyncTicket = textureManager->createAsyncTextureTicket( ... ); assert( texture->getResidencyStatus() == GpuResidency::Resident ); ... do something else that calls Ogre functionality ... assert( texture->getResidencyStatus() == GpuResidency::Resident ); asyncTicket->download( texture, mip, true ); Then the second assert may trigger because that "do something else" ended up calling a function inside Ogre that finalized the transition. Once you've called download and the resource was still Resident, you are safe that your data integrity will be kept.

Remarks
Beware of the ABA problem. If the following transitions are scheduled: OnStorage -> Resident -> OnStorage Then both getResidencyStatus & getNextResidencyStatus will return OnStorage. Use GpuResource::getPendingResidencyChanges to fix the ABA problem.

◆ getNumMipmaps()

uint8 Ogre::TextureGpu::getNumMipmaps ( void  ) const

◆ getNumSlices()

uint32 Ogre::TextureGpu::getNumSlices ( void  ) const

For TypeCube this value returns 6.

For TypeCubeArray, value returns numSlices * 6u.

◆ getOrientationMode()

virtual OrientationMode Ogre::TextureGpu::getOrientationMode ( void  ) const
virtual

◆ getPendingResidencyChanges()

uint32 Ogre::GpuResource::getPendingResidencyChanges ( void  ) const
inherited

Returns the number of pending residency changes.

Residency changes may not be immediate and thus be delayed (e.g. see TextureGpu::scheduleTransitionTo).

When this value is 0 it implies that mResidencyStatus == mNextResidencyStatus

◆ getPixelFormat()

PixelFormatGpu Ogre::TextureGpu::getPixelFormat ( void  ) const

◆ getPreferDepthTexture()

◆ getRealResourceNameStr()

virtual String Ogre::TextureGpu::getRealResourceNameStr ( void  ) const
virtual

Returns the real name (e.g. disk in file) of the resource.

◆ getRequestedSampleDescription()

SampleDescription Ogre::TextureGpu::getRequestedSampleDescription ( void  ) const

Returns original requested sample description, i.e. the raw input to setSampleDescription.

◆ getResidencyStatus()

GpuResidency::GpuResidency Ogre::GpuResource::getResidencyStatus ( void  ) const
inherited

◆ getResourceGroupStr()

virtual String Ogre::TextureGpu::getResourceGroupStr ( void  ) const
virtual

◆ getSampleDescription()

SampleDescription Ogre::TextureGpu::getSampleDescription ( void  ) const

Returns effective sample description supported by the API.

Note it's only useful after having transitioned to resident.

◆ getSettingsDesc()

String Ogre::TextureGpu::getSettingsDesc ( void  ) const

◆ getSizeBytes()

size_t Ogre::TextureGpu::getSizeBytes ( void  ) const

Returns total size in bytes used in GPU by this texture (not by its pool) including mipmaps.

◆ getSourceType()

uint8 Ogre::TextureGpu::getSourceType ( void  ) const

◆ getSubsampleLocations()

virtual void Ogre::TextureGpu::getSubsampleLocations ( vector< Vector2 >::type  locations)
pure virtual

Get the MSAA subsample locations.

mSampleDescription.pattern must not be MsaaPatterns::Undefined.

Parameters
locationsOutputs an array with the locations for each subsample. Values are in range [-1; 1]

Implemented in Ogre::VulkanTextureGpuWindow, Ogre::VulkanTextureGpu, Ogre::NULLTextureGpu, Ogre::MetalTextureGpu, Ogre::GL3PlusTextureGpuWindow, Ogre::GL3PlusTextureGpu, Ogre::D3D11TextureGpuWindow, and Ogre::D3D11TextureGpu.

◆ getTextureManager()

TextureGpuManager* Ogre::TextureGpu::getTextureManager ( void  ) const

◆ getTexturePool()

const TexturePool* Ogre::TextureGpu::getTexturePool ( void  ) const
inline

◆ getTexturePoolId()

uint32 Ogre::TextureGpu::getTexturePoolId ( void  ) const
inline

◆ getTextureType()

TextureTypes::TextureTypes Ogre::TextureGpu::getTextureType ( void  ) const

◆ getWidth()

uint32 Ogre::TextureGpu::getWidth ( void  ) const

◆ hasAutomaticBatching()

bool Ogre::TextureGpu::hasAutomaticBatching ( void  ) const

◆ hasAutoMipmapAuto()

bool Ogre::TextureGpu::hasAutoMipmapAuto ( void  ) const

◆ hasEquivalentParameters()

bool Ogre::TextureGpu::hasEquivalentParameters ( TextureGpu other) const

◆ hasMsaaExplicitResolves()

bool Ogre::TextureGpu::hasMsaaExplicitResolves ( void  ) const

◆ isDataReady()

bool Ogre::TextureGpu::isDataReady ( void  ) const

True if this texture is fully ready to be used for displaying.

IMPORTANT: Always returns true if getResidencyStatus != GpuResidency::Resident and there are no pending residency transitions.

Returns false while there are pending residency status

If this is true, then isMetadataReady is also true. See isMetadataReady.

◆ isDiscardableContent()

bool Ogre::TextureGpu::isDiscardableContent ( void  ) const

◆ isManualTexture()

bool Ogre::TextureGpu::isManualTexture ( void  ) const

◆ isMetadataReady()

bool Ogre::TextureGpu::isMetadataReady ( void  ) const

It is threadsafe to call this function from main thread.

If this returns false, then the following functions are not threadsafe: Setters must not be called, and getters may change from a worker thread: setResolution getWidth, getHeight, getDepth, getDepthOrSlices, getNumSlices set/getPixelFormat set/getNumMipmaps set/getTextureType getTexturePool Note that this function may return true but the worker thread may still be uploading to this texture. Use isDataReady to see if the worker thread is fully done with this texture.

Remarks
Function for querying/waiting for data and metadata to be ready are for blocking the main thread when a worker thread is loading the texture from file or a listener (i.e. isManualTexture returns false) otherwise you don't need to call these functions.

◆ isMsaaPatternSupported()

virtual bool Ogre::TextureGpu::isMsaaPatternSupported ( MsaaPatterns::MsaaPatterns  pattern)
virtual

Reimplemented in Ogre::D3D11TextureGpu.

◆ isMultisample()

bool Ogre::TextureGpu::isMultisample ( void  ) const

◆ isOpenGLRenderWindow()

virtual bool Ogre::TextureGpu::isOpenGLRenderWindow ( void  ) const
virtual

OpenGL RenderWindows are a bit specific:

  • Their origins are upside down. Which means we need to flip Y.
  • They can access resolved contents of MSAA even if hasMsaaExplicitResolves = true
  • Headless windows return false since internally they're FBOs. However isRenderWindowSpecific will return true

Reimplemented in Ogre::VulkanTextureGpuWindow, Ogre::GL3PlusTextureGpuHeadlessWindow, and Ogre::GL3PlusTextureGpuWindow.

◆ isPoolOwner()

bool Ogre::TextureGpu::isPoolOwner ( void  ) const

◆ isReinterpretable()

bool Ogre::TextureGpu::isReinterpretable ( void  ) const

◆ isRenderToTexture()

bool Ogre::TextureGpu::isRenderToTexture ( void  ) const

◆ isRenderWindowSpecific()

bool Ogre::TextureGpu::isRenderWindowSpecific ( void  ) const

◆ isTexture()

bool Ogre::TextureGpu::isTexture ( void  ) const

◆ isTextureGpu()

virtual bool Ogre::TextureGpu::isTextureGpu ( void  ) const
virtual

Reimplemented from Ogre::GpuTrackedResource.

◆ isUav()

bool Ogre::TextureGpu::isUav ( void  ) const

◆ notifyAllListenersTextureChanged()

void Ogre::TextureGpu::notifyAllListenersTextureChanged ( uint32  reason,
void *  extraData = 0 
)

◆ notifyDataIsReady()

virtual void Ogre::TextureGpu::notifyDataIsReady ( void  )
pure virtual

◆ operator delete() [1/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr)
inlineinherited

◆ operator delete() [2/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr,
const char *  ,
int  ,
const char *   
)
inlineinherited

◆ operator delete() [3/3]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete ( void *  ptr,
void *   
)
inlineinherited

◆ operator delete[]() [1/2]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete[] ( void *  ptr)
inlineinherited

◆ operator delete[]() [2/2]

template<class Alloc >
void Ogre::AllocatedObject< Alloc >::operator delete[] ( void *  ptr,
const char *  ,
int  ,
const char *   
)
inlineinherited

◆ operator new() [1/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz)
inlineinherited

◆ operator new() [2/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz,
const char *  file,
int  line,
const char *  func 
)
inlineinherited

operator new, with debug line info

◆ operator new() [3/3]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new ( size_t  sz,
void *  ptr 
)
inlineinherited

placement operator new

◆ operator new[]() [1/2]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new[] ( size_t  sz)
inlineinherited

◆ operator new[]() [2/2]

template<class Alloc >
void* Ogre::AllocatedObject< Alloc >::operator new[] ( size_t  sz,
const char *  file,
int  line,
const char *  func 
)
inlineinherited

array operator new, with debug line info

◆ prefersLoadingFromFileAsSRGB()

bool Ogre::TextureGpu::prefersLoadingFromFileAsSRGB ( void  ) const

◆ removeListener()

void Ogre::TextureGpu::removeListener ( TextureGpuListener listener)

◆ requiresTextureFlipping()

bool Ogre::TextureGpu::requiresTextureFlipping ( void  ) const

◆ scheduleReupload()

void Ogre::TextureGpu::scheduleReupload ( Image2 image = 0,
bool  autoDeleteImage = true 
)

There are times where you want to reload a texture again (e.g.

file on disk changed, uploading a new Image2, etc) without visual disruption.

e.g. if you were to call:

tex->scheduleTransitionTo( GpuResidency::OnStorage );
tex->scheduleTransitionTo( GpuResidency::Resident, ... );
@ Resident
VRAM and other GPU resources have been allocated for this resource.
Definition: OgreGpuResource.h:65
@ OnStorage
Texture is on storage (i.e.
Definition: OgreGpuResource.h:48

you'll achieve the same result, however the texture becomes immediately unavailable causing a few frames were all the user sees is a blank texture until it is fully reloaded.

This routine allows for an in-place hot-reload, where the old texture is swapped for the new one once it's done loading.

This is also faster because DescriptorTextureSets don't change

Remarks
  1. Assumes the last queued transition to perform is into Resident or OnSystemRam
  2. Visual hitches are unavoidable if metadata changes (e.g. new texture is of different pixel format, different number of mipmaps, resolution, etc) If that's the case, it is faster to transition to OnStorage, remove the metadata entry from cache, then to Resident again
Parameters
imageSee TextureGpu::unsafeScheduleTransitionTo
autoDeleteImageSame TextureGpu::unsafeScheduleTransitionTo

◆ scheduleTransitionTo()

void Ogre::TextureGpu::scheduleTransitionTo ( GpuResidency::GpuResidency  nextResidency,
Image2 image = 0,
bool  autoDeleteImage = true 
)

Same as unsafeScheduleTransitionTo, but first checks if we're already in the residency state we want to go to, or if it has already been scheduled; thus it can be called multiple times.

◆ setNumMipmaps()

void Ogre::TextureGpu::setNumMipmaps ( uint8  numMipmaps)

◆ setOrientationMode()

virtual void Ogre::TextureGpu::setOrientationMode ( OrientationMode  orientationMode)
virtual

Sets the given orientation.

'this' must be a RenderTexture If Ogre wasn't build with OGRE_CONFIG_ENABLE_VIEWPORT_ORIENTATIONMODE, calls to this function will not stick (i.e. getOrientationMode always returns the same value)

See also
TextureGpu::msDefaultOrientationMode
TextureGpu::getInternalWidth
TextureGpu::getInternalHeight
Remarks
Must be OnStorage.

If OrientationMode == OR_DEGREE_90 or OR_DEGREE_270, the internal resolution if flipped. i.e. swap( width, height ). This is important if you need to perform copyTo operations or AsyncTextureTickets

This setting has only been tested with Vulkan and is likely to malfunction with the other APIs if set to anything other than OR_DEGREE_0

Reimplemented in Ogre::VulkanTextureGpuRenderTarget, Ogre::MetalTextureGpuRenderTarget, Ogre::GL3PlusTextureGpuRenderTarget, and Ogre::D3D11TextureGpuRenderTarget.

◆ setPixelFormat()

void Ogre::TextureGpu::setPixelFormat ( PixelFormatGpu  pixelFormat)

Sets the pixel format.

Remarks
If prefersLoadingFromFileAsSRGB() returns true, the format may not be fully honoured (as we'll use the equivalent _SRGB variation).

◆ setResolution()

void Ogre::TextureGpu::setResolution ( uint32  width,
uint32  height,
uint32  depthOrSlices = 1u 
)

◆ setSampleDescription()

void Ogre::TextureGpu::setSampleDescription ( SampleDescription  desc)

◆ setTexturePoolId()

void Ogre::TextureGpu::setTexturePoolId ( uint32  poolId)

2D Texture with automatic batching will be merged with other textures into the same pool as one big 2D Array texture behind the scenes.

For two textures to be placed in the same pool (assuming it's not full) the following must match: Width, Height, PixelFormat, number of mipmaps, poolID

Pool ID is an arbitrary value with no actual meaning. This is ID allows you to prevent certain textures from being group together. For example, you may want all textures from Level 0 to be grouped together while Level 1 gets grouped together in a different pool

See also
TextureFlags::AutomaticBatching
TextureGpuManager::reservePoolId
Remarks
This value cannot be changed while the texture is resident (i.e. because it has already been assigned to a pool)
Parameters
poolIdArbitrary value. Default value is 0.

◆ setTextureType()

◆ supportsAsDepthBufferFor()

virtual bool Ogre::TextureGpu::supportsAsDepthBufferFor ( TextureGpu colourTarget) const
virtual

◆ swapBuffers()

virtual void Ogre::TextureGpu::swapBuffers ( void  )
inlinevirtual

◆ unsafeScheduleTransitionTo()

void Ogre::TextureGpu::unsafeScheduleTransitionTo ( GpuResidency::GpuResidency  nextResidency,
Image2 image = 0,
bool  autoDeleteImage = true 
)

Schedules an async transition in residency.

If transitioning from OnStorage to Resident, it will read from file (ResourceGroup was set in createTexture) If transitioning from OnSystemRam to Resident, it will read from the pointer it has. Multiple transitions can be stack together.

Remarks
If you're not loading from file (i.e. you're creating it programatically), call _transitionTo & _setNextResidencyStatus directly. Once you've called scheduleTransitionTo at least once, calling _transitionTo is very dangerous, as there are race conditions.
See also
TextureGpu::scheduleTransitionTo
Parameters
nextResidencyThe residency to change to.
imagePointer to image if you want to load the texture from memory instead of loading it from file or a listener. Pointer must be null if this is a manual texture. Pointer must NOT be a stack variable nor be deleted immediately. The actual loading is postponed until the request reaches the worker thread. That means the image pointer is safe to delete once you receive the TextureGpuListener::Reason::ReadyForRendering message.
autoDeleteImageWhether we should call "delete image" once we're done using the image. Otherwise you must listen for TextureGpuListener::ReadyForRendering message to know when we're done using the image.

◆ waitForData()

void Ogre::TextureGpu::waitForData ( void  )

Blocks main thread until data is ready.

Afterwards isDataReady should return true. If it doesn't, then there was a problem loading the texture. See isMetadataReady remarks.

Q: What's the penalty for calling this function?

A: We need to wait for the worker thread to finish all previous textures until it processes this one. The manager only has broad resolution so it may be also possible that we even have to wait the worker thread to process a few textures that came after this one too.

Thus the cost can be anywhere from "very little" to "a lot" depending on the order in which other textures have been loaded.

The real cost is that you lose valuable ability to hide loading times. If you must call this function, you can mitigate the problem:

1. All textures you need to wait for, load them *first* together, then
   call TextureGpuManager::waitForStreamingCompletion (preferred) or
   this function. Then proceed to load the rest of the textures.
2. If you can't do the above, call this function as late as possible 

◆ waitForMetadata()

void Ogre::TextureGpu::waitForMetadata ( void  )

Blocks main thread until metadata is ready.

Afterwards isMetadataReady should return true. If it doesn't, then there was a problem loading the texture. See isMetadataReady remarks.

◆ writeContentsToFile()

void Ogre::TextureGpu::writeContentsToFile ( const String filename,
uint8  minMip,
uint8  maxMip,
bool  automaticResolve = true 
)

Writes the current contents of the render target to the named file.

Member Data Documentation

◆ msDefaultOrientationMode

OrientationMode Ogre::TextureGpu::msDefaultOrientationMode
static

PUBLIC VARIABLE.

This variable can be altered directly.

Changes are reflected immediately for new TextureGpus. Existing TextureGpus won't be affected

◆ msFinalTextureBuffer

const IdString Ogre::TextureGpu::msFinalTextureBuffer
static

◆ msMsaaTextureBuffer

const IdString Ogre::TextureGpu::msMsaaTextureBuffer
static

The documentation for this class was generated from the following file: