Files
FlaxEngine/Source/Engine/GraphicsDevice/OpenGL/GPUTextureOGL.Handles.cpp
2020-12-07 23:40:54 +01:00

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