95 lines
2.3 KiB
C++
95 lines
2.3 KiB
C++
// Copyright (c) 2012-2020 Wojciech Figat. All rights reserved.
|
|
|
|
#include "TextureOGL.h"
|
|
|
|
#if GRAPHICS_API_OPENGL
|
|
|
|
#include "RenderToolsOGL.h"
|
|
#include "GPUDeviceOGL.h"
|
|
#include "GPULimitsOGL.h"
|
|
#include "Engine/Graphics/PixelFormatExtensions.h"
|
|
|
|
void TextureOGL::initHandles()
|
|
{
|
|
// Cache properties
|
|
bool useSRV = IsShaderResource();
|
|
bool useDSV = IsDepthStencil();
|
|
bool useRTV = IsRenderTarget();
|
|
bool useUAV = IsUnorderedAccess();
|
|
int32 arraySize = ArraySize();
|
|
int32 mipLevels = MipLevels();
|
|
bool isArray = arraySize > 1;
|
|
bool isCubeMap = IsCubeMap();
|
|
bool isMsaa = IsMultiSample();
|
|
bool isVolume = IsVolume();
|
|
|
|
// Create resource views
|
|
if (useUAV)
|
|
{
|
|
_uav.InitAsFull(this, Format());
|
|
}
|
|
if (isVolume)
|
|
{
|
|
// Create handle for whole 3d texture
|
|
_handleVolume.InitAsFull(this);
|
|
|
|
// Init per slice views
|
|
_handlesPerSlice.Resize(Depth(), false);
|
|
if (_desc.HasPerSliceViews() && useRTV)
|
|
{
|
|
for (int32 sliceIndex = 0; sliceIndex < Depth(); sliceIndex++)
|
|
{
|
|
_handlesPerSlice[sliceIndex].InitAsView(this, Format(), GPUTextureViewOGL::ViewType::Texture2D, mipLevels, sliceIndex, 1);
|
|
}
|
|
}
|
|
}
|
|
else if (isArray)
|
|
{
|
|
// Resize handles
|
|
_handlesPerSlice.Resize(ArraySize(), false);
|
|
|
|
// Create per array slice handles
|
|
for (int32 arrayIndex = 0; arrayIndex < arraySize; arrayIndex++)
|
|
{
|
|
_handlesPerSlice[arrayIndex].InitAsView(this, Format(), GPUTextureViewOGL::ViewType::Texture2D, mipLevels, arrayIndex, 1);
|
|
}
|
|
|
|
// Create whole array handle
|
|
{
|
|
if (isCubeMap)
|
|
{
|
|
_handleArray.InitAsView(this, Format(), GPUTextureViewOGL::ViewType::Texture2D_Array, mipLevels, 0, arraySize);
|
|
}
|
|
else
|
|
{
|
|
_handleArray.InitAsView(this, Format(), GPUTextureViewOGL::ViewType::TextureCube_Array, mipLevels, 0, arraySize);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Create single handle for the whole texture
|
|
_handlesPerSlice.Resize(1, false);
|
|
_handlesPerSlice[0].InitAsFull(this);
|
|
}
|
|
|
|
// Init per mip map handles
|
|
if (HasPerMipViews())
|
|
{
|
|
// Init handles
|
|
_handlesPerMip.Resize(arraySize, false);
|
|
for (int32 arrayIndex = 0; arrayIndex < arraySize; arrayIndex++)
|
|
{
|
|
auto& slice = _handlesPerMip[arrayIndex];
|
|
slice.Resize(mipLevels, false);
|
|
|
|
for (int32 mipIndex = 0; mipIndex < mipLevels; mipIndex++)
|
|
{
|
|
slice[mipIndex].InitAsView(this, Format(), GPUTextureViewOGL::ViewType::Texture2D, mipLevels, arrayIndex, 1, mipIndex);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|