You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/CryEngine/RenderDll/XRenderD3D9/DXGL/Implementation/GLResource.hpp

690 lines
23 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
// Original file Copyright Crytek GMBH or its affiliates, used under license.
// Description : Declares the resource types and related functions
#ifndef __GLRESOURCE__
#define __GLRESOURCE__
#include "GLCommon.hpp"
#include "GLFormat.hpp"
#define DXGL_USE_PBO_FOR_STAGING_TEXTURES !DXGL_FULL_EMULATION
#define DXGL_SHARED_OBJECT_SYNCHRONIZATION 1
#define DXGL_STREAMING_CONSTANT_BUFFERS 1
namespace NCryOpenGL
{
class CDevice;
class CContext;
struct STextureUnitContext;
struct SSamplerState;
struct SShaderTextureViewConfiguration;
struct SShaderTextureBufferViewConfiguration;
struct SShaderImageViewConfiguration;
struct SOutputMergerTextureViewConfiguration;
DXGL_DECLARE_PTR(struct, SFrameBuffer);
DXGL_DECLARE_PTR(struct, SOutputMergerView);
DXGL_DECLARE_PTR(struct, SOutputMergerTextureView);
DXGL_DECLARE_PTR(struct, STexture);
DXGL_DECLARE_PTR(struct, SShaderView);
DXGL_DECLARE_PTR(struct, SShaderTextureBasedView);
DXGL_DECLARE_PTR(struct, SShaderTextureView);
DXGL_DECLARE_PTR(struct, SShaderTextureBufferView);
DXGL_DECLARE_PTR(struct, SShaderImageView);
DXGL_DECLARE_PTR(struct, SShaderBufferView);
DXGL_DECLARE_PTR(struct, SDefaultFrameBufferTexture);
DXGL_DECLARE_PTR(struct, SBuffer);
DXGL_DECLARE_PTR(struct, SQuery);
#if DXGL_STREAMING_CONSTANT_BUFFERS
DXGL_DECLARE_PTR(struct, SContextFrame)
#endif //DXGL_STREAMING_CONSTANT_BUFFERS
enum
{
MAX_NUM_CONTEXT_PER_DEVICE = 32
};
struct SFrameBufferConfiguration
{
enum
{
DEPTH_ATTACHMENT_INDEX = 0,
STENCIL_ATTACHMENT_INDEX = 1,
FIRST_COLOR_ATTACHMENT_INDEX = STENCIL_ATTACHMENT_INDEX + 1,
MAX_COLOR_ATTACHMENTS = D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT,
MAX_ATTACHMENTS = FIRST_COLOR_ATTACHMENT_INDEX + MAX_COLOR_ATTACHMENTS
};
SOutputMergerView* m_akAttachments[MAX_ATTACHMENTS];
SFrameBufferConfiguration();
static GLenum AttachmentIndexToID(uint32 uIndex);
static uint32 AttachmentIDToIndex(GLenum eID);
};
struct SSharingFence
{
#if DXGL_SHARED_OBJECT_SYNCHRONIZATION
GLsync m_pFence;
SBitMask<MAX_NUM_CONTEXT_PER_DEVICE, SSpinlockBitMaskWord> m_akWaitIssued;
#endif //DXGL_SHARED_OBJECT_SYNCHRONIZATION
SSharingFence();
~SSharingFence();
void IssueFence(CDevice* pDevice, bool bAvoidFlushing = false);
void IssueWait(CContext* pContext);
};
struct SResourceNamePool;
struct UResourceNameSlot
{
SList::TListEntry m_kNextFree;
struct SUsed
{
GLuint m_uName;
UResourceNameSlot* m_pBlock;
volatile LONG m_uRefCount;
} m_kUsed;
};
struct SResourceNameBlockHeader
{
UResourceNameSlot* m_pNext;
SResourceNamePool* m_pPool;
volatile LONG m_uRefCount;
SList m_kFreeList;
uint32 m_uSize;
};
class CResourceName
{
public:
CResourceName();
CResourceName(UResourceNameSlot* pSlot);
CResourceName(const CResourceName& kOther);
~CResourceName();
CResourceName& operator=(const CResourceName& kOther);
bool operator==(const CResourceName& kOther) const;
bool operator!=(const CResourceName& kOther) const;
GLuint GetName() const;
bool IsValid() const;
protected:
void Acquire();
void Release();
UResourceNameSlot* m_pSlot;
};
struct SResourceNamePool
{
typedef UResourceNameSlot TSlot;
typedef SResourceNameBlockHeader TBlockHeader;
enum
{
MIN_BLOCK_SIZE = 256, GROWTH_FACTOR = 2, NUM_HEADER_SLOTS = (sizeof(TBlockHeader) + sizeof(TSlot) - 1) / sizeof(TSlot)
};
TSlot* m_pBlocksHead;
TCriticalSection m_kBlockSection;
SResourceNamePool();
~SResourceNamePool();
CResourceName Create(GLuint uName);
};
inline CResourceName::CResourceName()
: m_pSlot(NULL)
{
}
inline CResourceName::CResourceName(UResourceNameSlot* pSlot)
: m_pSlot(pSlot)
{
if (AtomicIncrement(&m_pSlot->m_kUsed.m_uRefCount) == 1)
{
AtomicIncrement(&alias_cast<SResourceNameBlockHeader*>(m_pSlot->m_kUsed.m_pBlock)->m_uRefCount);
}
}
inline CResourceName::CResourceName(const CResourceName& kOther)
: m_pSlot(kOther.m_pSlot)
{
Acquire();
}
inline CResourceName::~CResourceName()
{
Release();
}
inline CResourceName& CResourceName::operator=(const CResourceName& kOther)
{
Release();
m_pSlot = kOther.m_pSlot;
Acquire();
return *this;
}
inline bool CResourceName::operator==(const CResourceName& kOther) const
{
return m_pSlot == kOther.m_pSlot;
}
inline bool CResourceName::operator!=(const CResourceName& kOther) const
{
return !operator==(kOther);
}
inline void CResourceName::Acquire()
{
if (m_pSlot != NULL && AtomicIncrement(&m_pSlot->m_kUsed.m_uRefCount) == 1)
{
AtomicIncrement(&alias_cast<SResourceNameBlockHeader*>(m_pSlot->m_kUsed.m_pBlock)->m_uRefCount);
}
}
inline void CResourceName::Release()
{
if (m_pSlot != NULL && AtomicDecrement(&m_pSlot->m_kUsed.m_uRefCount) == 0)
{
SResourceNameBlockHeader* pBlockHeader(alias_cast<SResourceNameBlockHeader*>(m_pSlot->m_kUsed.m_pBlock));
if (AtomicDecrement(&pBlockHeader->m_uRefCount) == 0)
{
delete [] m_pSlot->m_kUsed.m_pBlock;
}
else
{
pBlockHeader->m_kFreeList.Push(m_pSlot->m_kNextFree);
}
}
}
inline GLuint CResourceName::GetName() const
{
return m_pSlot == NULL ? 0 : m_pSlot->m_kUsed.m_uName;
}
inline bool CResourceName::IsValid() const
{
return m_pSlot != NULL;
}
DXGL_DECLARE_REF_COUNTED(struct, SResource)
{
typedef void (* UpdateSubresourceFunc) (SResource* pResource, uint32 uSubresource, const D3D11_BOX* pDstBox, const void* pSrcData, uint32 uSrcRowPitch, uint32 uSrcDepthPitch, CContext* pContext);
typedef bool (* MapSubresourceFunc) (SResource* pResource, uint32 uSubresource, D3D11_MAP MapType, UINT MapFlags, D3D11_MAPPED_SUBRESOURCE* pMappedResource, CContext* pContext);
typedef void (* UnmapSubresourceFunc) (SResource* pResource, uint32 uSubresource, CContext* pContext);
CResourceName m_kName;
UpdateSubresourceFunc m_pfUpdateSubresource;
MapSubresourceFunc m_pfMapSubresource;
UnmapSubresourceFunc m_pfUnmapSubresource;
SSharingFence m_kCreationFence;
SResource();
SResource(const SResource&kOther);
virtual ~SResource();
};
struct SFrameBufferObject
{
typedef SBitMask<SFrameBufferConfiguration::MAX_COLOR_ATTACHMENTS, SUnsafeBitMaskWord> TColorAttachmentMask;
CResourceName m_kName;
bool m_bUsesSRGB;
TColorAttachmentMask m_kDrawMaskCache;
SFrameBufferObject();
~SFrameBufferObject();
};
void InitializeCryGlFramebufferFunctions();
DXGL_DECLARE_REF_COUNTED(struct, SFrameBuffer)
{
SFrameBufferConfiguration m_kConfiguration;
SFrameBufferObject m_kObject;
CContext* m_pContext;
// Specification of the list of color attachments that are enabled for writing
GLenum m_aeDrawBuffers[SFrameBufferConfiguration::MAX_COLOR_ATTACHMENTS];
GLuint m_uNumDrawBuffers;
SFrameBufferObject::TColorAttachmentMask m_kDrawMask;
SFrameBuffer(const SFrameBufferConfiguration&kConfiguration);
~SFrameBuffer();
bool Validate();
};
struct SMappedSubTexture
{
uint8* m_pBuffer;
uint32 m_uDataOffset;
bool m_bUpload;
uint32 m_uRowPitch;
uint32 m_uImagePitch;
SMappedSubTexture()
: m_pBuffer(NULL)
{
}
};
struct STextureUnitCache;
struct STextureState
{
GLint m_iBaseMipLevel;
GLint m_iMaxMipLevel;
#if DXGL_SUPPORT_STENCIL_TEXTURES
GLint m_iDepthStencilTextureMode; // 0 if not used
#endif //DXGL_SUPPORT_STENCIL_TEXTURES
TSwizzleMask m_uSwizzleMask;
void ApplyFormatMode(GLuint uTexture, GLenum eTarget);
void ApplyFormatMode(GLenum eTarget);
void Apply(GLuint uTexture, GLenum eTarget, const STextureUnitCache& kCurrentUnitCache);
bool operator==(const STextureState& kOther) const
{
return
m_iBaseMipLevel == kOther.m_iBaseMipLevel &&
m_iMaxMipLevel == kOther.m_iMaxMipLevel &&
#if DXGL_SUPPORT_STENCIL_TEXTURES
m_iDepthStencilTextureMode == kOther.m_iDepthStencilTextureMode &&
#endif //DXGL_SUPPORT_STENCIL_TEXTURES
m_uSwizzleMask == kOther.m_uSwizzleMask;
}
bool operator!=(const STextureState& kOther) const
{
return !operator==(kOther);
}
};
template <typename T>
struct STexVec
{
T x, y, z;
STexVec() {}
STexVec(T kX, T kY, T kZ)
: x(kX)
, y(kY)
, z(kZ) {}
};
typedef STexVec<GLsizei> STexSize;
typedef STexVec<GLint> STexPos;
struct STexSubresourceID
{
GLint m_iMipLevel;
uint32 m_uElement;
};
enum EBufferBinding
{
eBB_Array,
eBB_CopyRead,
eBB_CopyWrite,
#if DXGL_SUPPORT_DRAW_INDIRECT
eBB_DrawIndirect,
#endif //DXGL_SUPPORT_DRAW_INDIRECT
eBB_ElementArray,
eBB_PixelPack,
eBB_PixelUnpack,
eBB_TransformFeedback,
eBB_UniformBuffer,
#if DXGL_SUPPORT_ATOMIC_COUNTERS
eBB_AtomicCounter,
#endif //DXGL_SUPPORT_ATOMIC_COUNTERS
#if DXGL_SUPPORT_DISPATCH_INDIRECT
eBB_DispachIndirect,
#endif //DXGL_SUPPORT_DISPATCH_INDIRECT
#if DXGL_SUPPORT_SHADER_STORAGE_BLOCKS
eBB_ShaderStorage,
#endif //DXGL_SUPPORT_SHADER_STORAGE_BLOCKS
eBB_NUM
};
struct SBufferRange
{
uint32 m_uOffset;
uint32 m_uSize;
SBufferRange(uint32 uOffset = 0, uint32 uSize = 0)
: m_uOffset(uOffset)
, m_uSize(uSize)
{
}
bool operator==(const SBufferRange& kOther) const
{
return
m_uOffset == kOther.m_uOffset &&
m_uSize == kOther.m_uSize;
}
bool operator!=(const SBufferRange& kOther) const
{
return !operator==(kOther);
}
};
//#define DXGL_USE_LAZY_CLEAR
struct STexture
: SResource
{
STexture(GLsizei iWidth, GLsizei iHeight, GLsizei iDepth, GLenum eTarget, EGIFormat eFormat, uint32 uNumMipLevels, uint32 uNumElements);
virtual ~STexture();
virtual SShaderTextureViewPtr CreateShaderResourceView(const SShaderTextureViewConfiguration& kConfiguration, CContext* pContext);
virtual SShaderImageViewPtr CreateUnorderedAccessView(const SShaderImageViewConfiguration& kConfiguration, CContext* pContext);
virtual SOutputMergerTextureViewPtr CreateOutputMergerView(const SOutputMergerTextureViewConfiguration& kConfiguration, CContext* pContext);
SOutputMergerTextureViewPtr GetCompatibleOutputMergerView(const SOutputMergerTextureViewConfiguration& kConfiguration, CContext* pContext);
virtual void OnCopyRead(CContext* pContext) {};
virtual void OnCopyWrite(CContext* pContext) {};
void SetMinLod(float minLod);
float GetMinLod() const { return m_fMinLod; }
#if defined(ANDROID)
void ResetDontCareActionFlags();
void UpdateDontCareActionFlagsOnBound();
void UpdateDontCareActionFlagsOnUnbound();
#endif
typedef std::vector<SMappedSubTexture> TMappedSubTextures;
typedef std::vector<SOutputMergerTextureViewPtr> TCopySubTextureViews;
GLsizei m_iWidth, m_iHeight, m_iDepth;
GLenum m_eTarget;
EGIFormat m_eFormat;
uint32 m_uNumMipLevels;
uint32 m_uNumElements; // array_size * number_of_faces
// Texture view used for glCopyImageSubData if the driver requires a custom view for that, texture name otherwise
CResourceName m_kCopyImageView;
GLenum m_eCopyImageTarget;
typedef void(*TransferDataFunc) (STexture* pTexture, STexSubresourceID kSubID, STexPos kOffset, STexSize kSize, const SMappedSubTexture& kDataLocation, CContext* pContext);
typedef uint32(*LocatePackedDataFunc) (STexture* pTexture, STexSubresourceID kSubID, STexPos kOffset, SMappedSubTexture& kDataLocation);
TransferDataFunc m_pfUnpackData;
TransferDataFunc m_pfPackData;
LocatePackedDataFunc m_pfLocatePackedDataFunc;
#if DXGL_USE_PBO_FOR_STAGING_TEXTURES
CResourceName* m_akPixelBuffers; // Only used for staging textures
#else
uint8* m_pSystemMemoryCopy; // Only used for staging textures
#endif
TMappedSubTextures m_kMappedSubTextures;
TCopySubTextureViews m_kCopySubTextureViews;
STextureState m_kCache;
SShaderTextureView* m_pShaderViewsHead;
SOutputMergerTextureView* m_pOutputMergerViewsHead;
SShaderTextureView* m_pBoundModifier; // NULL if no SRV for this texture has bound custom texture parameters
#if defined(DXGL_USE_LAZY_CLEAR)
float m_ClearColor[4];
_smart_ptr<SOutputMergerView> m_spViewToClear;
float m_fClearDepthValue;
bool m_bClearDepth;
bool m_bClearStencil;
uint8 m_uClearStencilValue;
#endif
#if defined(ANDROID)
bool m_bColorLoadDontCare;
bool m_bDepthLoadDontCare;
bool m_bStencilLoadDontCare;
bool m_bColorStoreDontCare;
bool m_bDepthStoreDontCare;
bool m_bStencilStoreDontCare;
bool m_bColorStoreDontCareWhenUnbound;
bool m_bDepthStoreDontCareWhenUnbound;
bool m_bStencilStoreDontCareWhenUnbound;
bool m_bColorWasInvalidatedWhenUnbound;
bool m_bDepthWasInvalidatedWhenUnbound;
bool m_bStencilWasInvalidatedWhenUnbound;
#endif
private:
// Making this private so that users have to use the Set/Get since there
// is a corresponding gl call that needs to be called when this variable
// is set.
GLfloat m_fMinLod;
};
#if DXGL_SUPPORT_APITRACE
struct SDynamicBufferCopy
{
uint8* m_pData;
uint32 m_uSize;
#if defined(WIN32)
void** m_apDirtyPages;
uint32 m_uNumPages;
static uint32 ms_uPageSize;
#endif //defined(WIN32)
SDynamicBufferCopy();
~SDynamicBufferCopy();
uint8* Allocate(uint32 uSize);
void Free();
void ResetDirtyRegion();
bool GetDirtyRegion(uint32& uOffset, uint32& uSize);
};
#endif //DXGL_SUPPORT_APITRACE
struct SBuffer
: SResource
{
SBuffer();
virtual ~SBuffer();
SShaderViewPtr CreateShaderResourceView(EGIFormat eFormat, uint32 uFirstElement, uint32 uNumElements, uint32 uFlags, CContext* pContext);
SShaderViewPtr CreateUnorderedAccessView(EGIFormat eFormat, uint32 uFirstElement, uint32 uNumElements, uint32 uFlags, CContext* pContext);
SShaderTextureBufferViewPtr GetTextureBuffer(SShaderTextureBufferViewConfiguration& kConfiguration, CContext* pContext);
SShaderBufferViewPtr CreateBufferView(uint32 uFirstElement, uint32 uNumElements, CContext* pContext);
typedef bool (* MapBufferRangeFunc) (SBuffer* pBuffer, size_t uOffset, size_t uSize, D3D11_MAP MapType, UINT MapFlags, D3D11_MAPPED_SUBRESOURCE* pMappedResource, CContext* pContext);
MapBufferRangeFunc m_pfMapBufferRange;
SBitMask<eBB_NUM, SUnsafeBitMaskWord> m_kBindings;
GLenum m_eUsage;
uint32 m_uSize;
uint32 m_uElementSize; // 0 if not structured
uint8* m_pSystemMemoryCopy;
bool m_bMapped;
size_t m_uMapOffset;
size_t m_uMapSize;
SShaderTextureBufferView* m_pTextureBuffersHead;
#if DXGL_SUPPORT_APITRACE
SDynamicBufferCopy m_kDynamicCopy;
bool m_bSystemMemoryCopyOwner;
#endif //DXGL_SUPPORT_APITRACE
#if DXGL_STREAMING_CONSTANT_BUFFERS
struct SContextCache
{
SContextFramePtr m_spFrame;
SBufferRange m_kRange;
uint32 m_uUnit;
uint32 m_uStreamOffset;
} m_akContextCaches[MAX_NUM_CONTEXT_PER_DEVICE];
DXGL_TODO("Evaluate if it is worth to have multiple possible bindings cached - eventually add another dimension and keep items sorted by slot for binary search");
SBitMask<MAX_NUM_CONTEXT_PER_DEVICE, SSpinlockBitMaskWord> m_kContextCachesValid;
bool m_bStreaming;
#endif //DXGL_STREAMING_CONSTANT_BUFFERS
};
DXGL_DECLARE_REF_COUNTED(struct, SQuery)
{
virtual ~SQuery();
virtual void Begin();
virtual void End();
virtual bool GetData(void* pData, uint32 uDataSize, bool bFlush) = 0;
virtual uint32 GetDataSize();
};
struct SPlainQuery
: SQuery
{
SPlainQuery(GLenum eTarget);
virtual ~SPlainQuery();
virtual void Begin();
virtual void End();
GLuint m_uName;
GLenum m_eTarget;
bool m_bBegun;
};
struct SOcclusionQuery
: SPlainQuery
{
SOcclusionQuery();
virtual bool GetData(void* pData, uint32 uDataSize, bool bFlush);
virtual uint32 GetDataSize();
};
struct SFenceSync
: SQuery
{
SFenceSync();
virtual ~SFenceSync();
virtual void End();
virtual bool GetData(void* pData, uint32 uDataSize, bool bFlush);
virtual uint32 GetDataSize();
GLsync m_pFence;
};
#if DXGL_SUPPORT_TIMER_QUERIES
struct STimestampDisjointQuery
: SQuery
{
virtual bool GetData(void* pData, uint32 uDataSize, bool bFlush);
virtual uint32 GetDataSize();
};
struct STimestampQuery
: SQuery
{
STimestampQuery();
virtual ~STimestampQuery();
virtual void End();
virtual bool GetData(void* pData, uint32 uDataSize, bool bFlush);
virtual uint32 GetDataSize();
GLuint m_uName;
};
#endif //DXGL_SUPPORT_TIMER_QUERIES
struct SDefaultFrameBufferTexture
: STexture
{
SDefaultFrameBufferTexture(GLsizei iWidth, GLsizei iHeight, EGIFormat eFormat, GLbitfield eBufferMask);
virtual ~SDefaultFrameBufferTexture();
virtual SShaderTextureViewPtr CreateShaderResourceView(const SShaderTextureViewConfiguration& kConfiguration, CContext* pContext);
virtual SShaderImageViewPtr CreateUnorderedAccessView(const SShaderImageViewConfiguration& kConfiguration, CContext* pContext);
virtual SOutputMergerTextureViewPtr CreateOutputMergerView(const SOutputMergerTextureViewConfiguration& kConfiguration, CContext* pContext);
virtual void OnCopyRead(CContext* pContext);
virtual void OnCopyWrite(CContext* pContext);
void IncTextureRefCount(CContext* pContext);
void DecTextureRefCount();
void EnsureTextureExists(CContext* pContext);
void ReleaseTexture();
void OnWrite(CContext* pContext, bool bDefaultFrameBuffer);
void OnRead(CContext* pContext);
void Flush(CContext* pContext);
#if DXGL_FULL_EMULATION
void SetCustomWindowContext(const TWindowContext& kCustomWindowContext);
#endif //DXGL_FULL_EMULATION
static void UpdateSubresource(SResource* pResource, uint32 uSubresource, const D3D11_BOX* pDstBox, const void* pSrcData, uint32 uSrcRowPitch, uint32 uSrcDepthPitch, CContext* pContext);
static bool MapSubresource(SResource* pResource, uint32 uSubresource, D3D11_MAP MapType, UINT MapFlags, D3D11_MAPPED_SUBRESOURCE* pMappedResource, CContext* pContext);
static void UnmapSubresource(SResource* pResource, uint32 uSubresource, CContext* pContext);
static void UnpackData(STexture* pTexture, STexSubresourceID kSubID, STexPos kOffset, STexSize kSize, const SMappedSubTexture& kDataLocation, CContext* pContext);
static void PackData(STexture* pTexture, STexSubresourceID kSubID, STexPos kOffset, STexSize kSize, const SMappedSubTexture& kDataLocation, CContext* pContext);
static uint32 LocatePackedData(STexture* pTexture, STexSubresourceID kSubID, STexPos kOffset, SMappedSubTexture& kDataLocation);
uint32 m_uTextureRefCount;
SFrameBufferObject m_kInputFBO;
SFrameBufferObject m_kDefaultFBO;
GLbitfield m_uBufferMask;
GLenum m_eInputColorBuffer, m_eOutputColorBuffer;
GLsizei m_iDefaultFBOWidth, m_iDefaultFBOHeight;
bool m_bInputDirty, m_bOutputDirty;
SShaderTextureViewPtr m_kInputFBOColorTextureView;
#if DXGL_FULL_EMULATION
TWindowContext m_kCustomWindowContext;
#endif //DXGL_FULL_EMULATION
};
STexturePtr CreateTexture1D(const D3D11_TEXTURE1D_DESC& kDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, CContext* pContext);
STexturePtr CreateTexture2D(const D3D11_TEXTURE2D_DESC& kDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, CContext* pContext);
STexturePtr CreateTexture3D(const D3D11_TEXTURE3D_DESC& kDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, CContext* pContext);
SBufferPtr CreateBuffer(const D3D11_BUFFER_DESC& kDesc, const D3D11_SUBRESOURCE_DATA* pInitialData, CContext* pContext);
SQueryPtr CreateQuery(const D3D11_QUERY_DESC& kDesc, CContext* pContext);
SDefaultFrameBufferTexturePtr CreateBackBufferTexture(const D3D11_TEXTURE2D_DESC& kDesc);
CResourceName CreateTextureView(STexture* pTexture, const SGIFormatInfo* pFormatInfo, GLenum eTarget, GLuint uMinMipLevel, GLuint uNumMipLevels, GLuint uMinLayer, GLuint uNumLayers, CContext* pContext);
GLenum GetBufferBindingTarget(EBufferBinding eBinding);
GLenum GetBufferBindingPoint(EBufferBinding eBinding);
void CopyTexture(STexture* pDstTexture, STexture* pSrcTexture, CContext* pContext);
void CopyBuffer(SBuffer* pDstBuffer, SBuffer* pSrcBuffer, CContext* pContext);
void CopySubTexture(STexture* pDstTexture, uint32 uDstSubresource, uint32 uDstX, uint32 uDstY, uint32 uDstZ, STexture* pSrcTexture, uint32 uSrcSubresource, const D3D11_BOX* pSrcBox, CContext* pContext);
void CopySubBuffer(SBuffer* pDstBuffer, uint32 uDstSubresource, uint32 uDstX, uint32 uDstY, uint32 uDstZ, SBuffer* pSrcBuffer, uint32 uSrcSubresource, const D3D11_BOX* pSrcBox, CContext* pContext);
}
#endif //__GLRESOURCE__