123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234 |
- //-----------------------------------------------------------------------------
- // Copyright (c) 2012 GarageGames, LLC
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #pragma once
- #ifndef _GFXTEXTUREPROFILE_H_
- #define _GFXTEXTUREPROFILE_H_
- #ifndef _TORQUE_STRING_H_
- #include "core/util/str.h"
- #endif
- class GFXTextureObject;
- /// Helper struct for gathering profile stats.
- class GFXTextureProfileStats
- {
- public:
- /// Constructs and clears the stats.
- GFXTextureProfileStats() { clear(); }
- /// Zeros all the stats.
- void clear()
- {
- dMemset( this, 0, sizeof( GFXTextureProfileStats ) );
- }
- /// Adds stats together.
- GFXTextureProfileStats& operator += ( const GFXTextureProfileStats &stats )
- {
- activeCount += stats.activeCount;
- activeTexels += stats.activeTexels;
- activeBytes += stats.activeBytes;
- allocatedTextures += stats.allocatedTextures;
- allocatedTexels += stats.allocatedTexels;
- allocatedBytes += stats.allocatedBytes;
- return *this;
- }
- U32 activeCount; ///< Count of textures of this profile type allocated.
- U32 activeTexels; ///< Amount of texelspace currently allocated under this profile.
- U32 activeBytes; ///< Amount of storage currently allocated under this profile.
- U32 allocatedTextures; ///< Total number of textures allocated under this profile.
- U32 allocatedTexels; ///< Total number of texels allocated under this profile.
- U32 allocatedBytes; ///< Total number of bytes allocated under this profile.
- };
- class GFXTextureProfile
- {
- public:
- enum Types
- {
- DiffuseMap,
- NormalMap,
- AlphaMap,
- LuminanceMap
- };
- enum Flags
- {
- PreserveSize = BIT(0), ///< Never shrink this bitmap in low VRAM situations.
- NoMipmap = BIT(1), ///< Do not generate mipmap chain for this texture.
- SystemMemory = BIT(2), ///< System memory texture - isn't uploaded to card - useful as target for copying surface data out of video ram
- RenderTarget = BIT(3), ///< This texture will be used as a render target.
- Dynamic = BIT(4), ///< This texture may be refreshed. (Precludes Static)
- Static = BIT(5), ///< This texture will never be modified once loaded. (Precludes Dynamic)
- NoPadding = BIT(6), ///< Do not pad this texture if it's non pow2.
- KeepBitmap = BIT(7), ///< Always keep a copy of this texture's bitmap. (Potentially in addition to the API managed copy?)
- ZTarget = BIT(8), ///< This texture will be used as a Z target.
- SRGB = BIT(9), ///< sRGB texture
- /// Track and pool textures of this type for reuse.
- ///
- /// You should use this profile flag sparingly. Odd
- /// sized textures and spikes in allocation can cause
- /// the pool to contain unused textures which will remain
- /// in memory until a flush occurs.
- ///
- Pooled = BIT(10),
- /// A hint that the device is not allowed to discard the content
- /// of a target texture after presentation or deactivated.
- ///
- /// This is mainly a depth buffer optimization.
- NoDiscard = BIT(11),
-
- NoModify = BIT(11)
- };
- enum Compression
- {
- NONE,
- BC1,
- BC2,
- BC3,
- BC4,
- BC5,
- };
- GFXTextureProfile(const String &name, Types type, U32 flags, Compression compression = NONE);
- // Equality operators
- inline bool operator==(const GFXTextureProfile &in_Cmp) const { return (mName == in_Cmp.mName && mProfile == in_Cmp.mProfile); }
- inline bool operator!=(const GFXTextureProfile &in_Cmp) const { return !(*this == in_Cmp); }
- // Accessors
- String getName() const { return mName; };
- Types getType() const { return (Types)(mProfile & (BIT(TypeBits) - 1)); }
- const Compression getCompression() const { return (Compression)((mProfile >> (FlagBits + TypeBits)) & (BIT(CompressionBits + 1) - 1)); };
- bool testFlag(Flags flag) const
- {
- return (mProfile & (flag << TypeBits)) != 0;
- }
- // Mutators
- const U32 getDownscale() const { return mDownscale; }
- void setDownscale(const U32 shift) { mDownscale = shift; }
- void incActiveCopies() { mStats.activeCount++; }
- void decActiveCopies() { AssertFatal( mStats.activeCount != 0, "Ran out of extant copies!"); mStats.activeCount--; }
- // And static interface...
- static void init();
- static GFXTextureProfile *find(const String &name);
- static void updateStatsForCreation(GFXTextureObject *t);
- static void updateStatsForDeletion(GFXTextureObject *t);
- /// Collects the total stats for all the profiles which
- /// include any of the flag bits.
- static void collectStats( Flags flags, GFXTextureProfileStats *stats );
- /// Returns the total profile count in the list.
- static U32 getProfileCount() { return smProfileCount; }
- /// Returns the head of the profile list.
- static GFXTextureProfile* getHead() { return smHead; }
- /// Returns the next profile in the list.
- GFXTextureProfile* getNext() const { return mNext; }
- /// Returns the allocation stats for this texture profile.
- inline const GFXTextureProfileStats& getStats() const { return mStats; }
- // Helper functions...
- inline bool doStoreBitmap() const { return testFlag(KeepBitmap); }
- inline bool canDownscale() const { return !testFlag(PreserveSize); }
- inline bool isDynamic() const { return testFlag(Dynamic); }
- inline bool isRenderTarget() const { return testFlag(RenderTarget); }
- inline bool isZTarget() const { return testFlag(ZTarget); }
- inline bool isSystemMemory() const { return testFlag(SystemMemory); }
- inline bool noMip() const { return testFlag(NoMipmap); }
- inline bool isPooled() const { return testFlag(Pooled); }
- inline bool canDiscard() const { return !testFlag(NoDiscard); }
- inline bool isSRGB() const { return testFlag(SRGB); }
- //compare profile flags for equality
- inline bool compareFlags(const GFXTextureProfile& in_Cmp) const{ return (mProfile == in_Cmp.mProfile); }
- private:
- /// These constants control the packing for the profile; if you add flags, types, or
- /// compression info then make sure these are giving enough bits!
- enum Constants
- {
- TypeBits = 2,
- FlagBits = 12,
- CompressionBits = 3,
- };
- String mName; ///< Name of this profile...
- U32 mDownscale; ///< Amount to shift textures of this type down, if any.
- U32 mProfile; ///< Stores a munged version of the profile data.
- U32 mActiveCount; ///< Count of textures of this profile type allocated.
- U32 mActiveTexels; ///< Amount of texelspace currently allocated under this profile.
- U32 mActiveBytes; ///< Amount of storage currently allocated under this profile.
- U32 mAllocatedTextures; ///< Total number of textures allocated under this profile.
- U32 mAllocatedTexels; ///< Total number of texels allocated under this profile.
- U32 mAllocatedBytes; ///< Total number of bytes allocated under this profile.
- /// The texture profile stats.
- GFXTextureProfileStats mStats;
-
- /// The number of profiles in the system.
- static U32 smProfileCount;
- /// Keep a list of all the profiles.
- GFXTextureProfile *mNext;
- static GFXTextureProfile *smHead;
- };
- #define GFX_DeclareTextureProfile(name) extern GFXTextureProfile name
- #define GFX_ImplementTextureProfile(name, type, flags, compression) GFXTextureProfile name(#name, type, flags, compression)
- // Default Texture profiles
- // Texture we can render to.
- GFX_DeclareTextureProfile(GFXRenderTargetProfile);
- GFX_DeclareTextureProfile(GFXRenderTargetSRGBProfile);
- // Standard static diffuse textures
- GFX_DeclareTextureProfile(GFXStaticTextureProfile);
- GFX_DeclareTextureProfile(GFXStaticTextureSRGBProfile);
- // Standard static diffuse textures that are persistent in memory
- GFX_DeclareTextureProfile(GFXTexturePersistentProfile);
- GFX_DeclareTextureProfile(GFXTexturePersistentSRGBProfile);
- // Texture that resides in system memory - used to copy data to
- GFX_DeclareTextureProfile(GFXSystemMemTextureProfile);
- // normal map profiles
- GFX_DeclareTextureProfile(GFXNormalMapProfile);
- GFX_DeclareTextureProfile(GFXNormalMapBC3Profile);
- GFX_DeclareTextureProfile(GFXNormalMapBC5Profile);
- // Depth buffer texture
- GFX_DeclareTextureProfile(GFXZTargetProfile);
- // Dynamic Texure
- GFX_DeclareTextureProfile(GFXDynamicTextureProfile);
- GFX_DeclareTextureProfile(GFXDynamicTextureSRGBProfile);
- #endif
|