1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00
GLideN64/src/ZlutTexture.cpp

88 lines
2.6 KiB
C++
Raw Normal View History

2017-01-07 09:40:50 +00:00
#include "Graphics/Context.h"
#include "Graphics/Parameters.h"
#include "DepthBuffer.h"
#include "Config.h"
2017-01-07 09:40:50 +00:00
#include "Textures.h"
#include "ZlutTexture.h"
2017-01-21 11:44:56 +00:00
using namespace graphics;
2017-01-07 09:40:50 +00:00
ZlutTexture g_zlutTexture;
ZlutTexture::ZlutTexture()
: m_pTexture(nullptr)
{
}
void ZlutTexture::init()
{
if (!Context::imageTextures)
return;
2017-01-25 10:14:17 +00:00
const FramebufferTextureFormats & fbTexFormats = gfxContext.getFramebufferTextureFormats();
const void * zLUT;
if (fbTexFormats.lutFormatBytes == 4) {
std::vector<u32> vecZLUT(0x40000);
const u16 * const zLUT16 = depthBufferList().getZLUT();
for (u32 i = 0; i < 0x40000; ++i)
vecZLUT[i] = zLUT16[i];
zLUT = vecZLUT.data();
} else {
zLUT = depthBufferList().getZLUT();
}
2017-01-07 09:40:50 +00:00
m_pTexture = textureCache().addFrameBufferTexture(false);
m_pTexture->format = G_IM_FMT_IA;
m_pTexture->clampS = 1;
m_pTexture->clampT = 1;
m_pTexture->frameBufferTexture = CachedTexture::fbOneSample;
m_pTexture->maskS = 0;
m_pTexture->maskT = 0;
m_pTexture->mirrorS = 0;
m_pTexture->mirrorT = 0;
m_pTexture->realWidth = 512;
m_pTexture->realHeight = 512;
2017-01-25 10:14:17 +00:00
m_pTexture->textureBytes = m_pTexture->realWidth * m_pTexture->realHeight * fbTexFormats.lutFormatBytes;
2017-01-07 09:40:50 +00:00
textureCache().addFrameBufferTextureSize(m_pTexture->textureBytes);
2017-01-21 11:44:56 +00:00
Context::InitTextureParams initParams;
initParams.handle = m_pTexture->name;
2017-01-21 11:44:56 +00:00
initParams.ImageUnit = textureImageUnits::Zlut;
2017-01-07 09:40:50 +00:00
initParams.width = m_pTexture->realWidth;
initParams.height = m_pTexture->realHeight;
2017-01-14 12:26:02 +00:00
initParams.internalFormat = fbTexFormats.lutInternalFormat;
initParams.format = fbTexFormats.lutFormat;
initParams.dataType = fbTexFormats.lutType;
2017-01-07 09:40:50 +00:00
initParams.data = zLUT;
gfxContext.init2DTexture(initParams);
2017-01-21 11:44:56 +00:00
Context::TexParameters setParams;
setParams.handle = m_pTexture->name;
setParams.target = textureTarget::TEXTURE_2D;
2017-01-21 11:44:56 +00:00
setParams.textureUnitIndex = textureIndices::ZLUTTex;
setParams.minFilter = textureParameters::FILTER_NEAREST;
setParams.magFilter = textureParameters::FILTER_NEAREST;
setParams.wrapS = textureParameters::WRAP_CLAMP_TO_EDGE;
setParams.wrapT = textureParameters::WRAP_CLAMP_TO_EDGE;
2017-01-07 09:40:50 +00:00
gfxContext.setTextureParameters(setParams);
}
void ZlutTexture::destroy() {
if (!Context::imageTextures)
return;
2017-01-21 11:44:56 +00:00
const FramebufferTextureFormats & fbTexFormats = gfxContext.getFramebufferTextureFormats();
Context::BindImageTextureParameters bindParams;
bindParams.imageUnit = textureImageUnits::Zlut;
bindParams.texture = ObjectHandle();
bindParams.accessMode = textureImageAccessMode::READ_ONLY;
bindParams.textureFormat = fbTexFormats.lutInternalFormat;
gfxContext.bindImageTexture(bindParams);
2017-01-07 09:40:50 +00:00
textureCache().removeFrameBufferTexture(m_pTexture);
m_pTexture = nullptr;
}