use GL_TEXTURE_2D_ARRAY for most of our textures
This commit is contained in:
parent
60e9301f40
commit
6670cacddc
|
@ -21,6 +21,7 @@ int FramebufferManager::m_targetHeight;
|
||||||
int FramebufferManager::m_msaaSamples;
|
int FramebufferManager::m_msaaSamples;
|
||||||
|
|
||||||
GLenum FramebufferManager::m_textureType;
|
GLenum FramebufferManager::m_textureType;
|
||||||
|
int FramebufferManager::m_EFBLayers;
|
||||||
|
|
||||||
GLuint FramebufferManager::m_efbFramebuffer;
|
GLuint FramebufferManager::m_efbFramebuffer;
|
||||||
GLuint FramebufferManager::m_xfbFramebuffer;
|
GLuint FramebufferManager::m_xfbFramebuffer;
|
||||||
|
@ -72,42 +73,45 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
m_efbDepth = glObj[1];
|
m_efbDepth = glObj[1];
|
||||||
m_efbColorSwap = glObj[2];
|
m_efbColorSwap = glObj[2];
|
||||||
|
|
||||||
|
m_EFBLayers = 1;
|
||||||
|
|
||||||
// OpenGL MSAA textures are a different kind of texture type and must be allocated
|
// OpenGL MSAA textures are a different kind of texture type and must be allocated
|
||||||
// with a different function, so we create them separately.
|
// with a different function, so we create them separately.
|
||||||
if (m_msaaSamples <= 1)
|
if (m_msaaSamples <= 1)
|
||||||
{
|
{
|
||||||
m_textureType = GL_TEXTURE_2D;
|
m_textureType = GL_TEXTURE_2D_ARRAY;
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbColor);
|
glBindTexture(m_textureType, m_efbColor);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(m_textureType, 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage3D(m_textureType, 0, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbDepth);
|
glBindTexture(m_textureType, m_efbDepth);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(m_textureType, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
glTexImage3D(m_textureType, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbColorSwap);
|
glBindTexture(m_textureType, m_efbColorSwap);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(m_textureType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(m_textureType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(m_textureType, 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage3D(m_textureType, 0, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_textureType = GL_TEXTURE_2D_MULTISAMPLE;
|
m_textureType = GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
|
||||||
|
GLenum resolvedType = GL_TEXTURE_2D_ARRAY;
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbColor);
|
glBindTexture(m_textureType, m_efbColor);
|
||||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, false);
|
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbDepth);
|
glBindTexture(m_textureType, m_efbDepth);
|
||||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, false);
|
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||||
|
|
||||||
glBindTexture(m_textureType, m_efbColorSwap);
|
glBindTexture(m_textureType, m_efbColorSwap);
|
||||||
glTexImage2DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, false);
|
glTexImage3DMultisample(m_textureType, m_msaaSamples, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, false);
|
||||||
glBindTexture(m_textureType, 0);
|
glBindTexture(m_textureType, 0);
|
||||||
|
|
||||||
// Although we are able to access the multisampled texture directly, we don't do it everywhere.
|
// Although we are able to access the multisampled texture directly, we don't do it everywhere.
|
||||||
|
@ -118,23 +122,23 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
m_resolvedColorTexture = glObj[0];
|
m_resolvedColorTexture = glObj[0];
|
||||||
m_resolvedDepthTexture = glObj[1];
|
m_resolvedDepthTexture = glObj[1];
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, m_resolvedColorTexture);
|
glBindTexture(resolvedType, m_resolvedColorTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(resolvedType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(resolvedType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(resolvedType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_targetWidth, m_targetHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage3D(resolvedType, 0, GL_RGBA, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, m_resolvedDepthTexture);
|
glBindTexture(resolvedType, m_resolvedDepthTexture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(resolvedType, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri(resolvedType, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri(resolvedType, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
glTexImage3D(resolvedType, 0, GL_DEPTH_COMPONENT24, m_targetWidth, m_targetHeight, m_EFBLayers, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr);
|
||||||
|
|
||||||
// Bind resolved textures to resolved framebuffer.
|
// Bind resolved textures to resolved framebuffer.
|
||||||
glGenFramebuffers(1, &m_resolvedFramebuffer);
|
glGenFramebuffers(1, &m_resolvedFramebuffer);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_resolvedFramebuffer);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_resolvedFramebuffer);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_resolvedColorTexture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_resolvedColorTexture, 0);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_resolvedDepthTexture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_resolvedDepthTexture, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create XFB framebuffer; targets will be created elsewhere.
|
// Create XFB framebuffer; targets will be created elsewhere.
|
||||||
|
@ -143,8 +147,8 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
// Bind target textures to EFB framebuffer.
|
// Bind target textures to EFB framebuffer.
|
||||||
glGenFramebuffers(1, &m_efbFramebuffer);
|
glGenFramebuffers(1, &m_efbFramebuffer);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_efbFramebuffer);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_efbFramebuffer);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_textureType, m_efbColor, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_efbColor, 0);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_textureType, m_efbDepth, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_efbDepth, 0);
|
||||||
|
|
||||||
// EFB framebuffer is currently bound, make sure to clear its alpha value to 1.f
|
// EFB framebuffer is currently bound, make sure to clear its alpha value to 1.f
|
||||||
glViewport(0, 0, m_targetWidth, m_targetHeight);
|
glViewport(0, 0, m_targetWidth, m_targetHeight);
|
||||||
|
@ -168,9 +172,9 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
{
|
{
|
||||||
// non-msaa, so just fetch the pixel
|
// non-msaa, so just fetch the pixel
|
||||||
sampler =
|
sampler =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"vec4 sampleEFB(ivec2 pos) {\n"
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
" return texelFetch(samp9, pos, 0);\n"
|
" return texelFetch(samp9, ivec3(pos, 0), 0);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
}
|
}
|
||||||
else if (g_ogl_config.bSupportSampleShading)
|
else if (g_ogl_config.bSupportSampleShading)
|
||||||
|
@ -179,9 +183,9 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
// This will lead to sample shading, but it's the only way to not loose
|
// This will lead to sample shading, but it's the only way to not loose
|
||||||
// the values of each sample.
|
// the values of each sample.
|
||||||
sampler =
|
sampler =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DMSArray samp9;\n"
|
||||||
"vec4 sampleEFB(ivec2 pos) {\n"
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
" return texelFetch(samp9, pos, gl_SampleID);\n"
|
" return texelFetch(samp9, ivec3(pos, 0), gl_SampleID);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -190,11 +194,11 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
std::stringstream samples;
|
std::stringstream samples;
|
||||||
samples << m_msaaSamples;
|
samples << m_msaaSamples;
|
||||||
sampler =
|
sampler =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DMSArray samp9;\n"
|
||||||
"vec4 sampleEFB(ivec2 pos) {\n"
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
" vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n"
|
" vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n"
|
||||||
" for(int i=0; i<" + samples.str() + "; i++)\n"
|
" for(int i=0; i<" + samples.str() + "; i++)\n"
|
||||||
" color += texelFetch(samp9, pos, i);\n"
|
" color += texelFetch(samp9, ivec3(pos, 0), i);\n"
|
||||||
" return color / " + samples.str() + ";\n"
|
" return color / " + samples.str() + ";\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
}
|
}
|
||||||
|
@ -365,7 +369,7 @@ void FramebufferManager::ReinterpretPixelData(unsigned int convtype)
|
||||||
src_texture = m_efbColor;
|
src_texture = m_efbColor;
|
||||||
m_efbColor = m_efbColorSwap;
|
m_efbColor = m_efbColorSwap;
|
||||||
m_efbColorSwap = src_texture;
|
m_efbColorSwap = src_texture;
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_textureType, m_efbColor, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_efbColor, 0);
|
||||||
|
|
||||||
glViewport(0,0, m_targetWidth, m_targetHeight);
|
glViewport(0,0, m_targetWidth, m_targetHeight);
|
||||||
glActiveTexture(GL_TEXTURE0 + 9);
|
glActiveTexture(GL_TEXTURE0 + 9);
|
||||||
|
@ -397,7 +401,7 @@ void XFBSource::CopyEFB(float Gamma)
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferManager::GetXFBFramebuffer());
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FramebufferManager::GetXFBFramebuffer());
|
||||||
|
|
||||||
// Bind texture.
|
// Bind texture.
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
|
glFramebufferTexture(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 0);
|
||||||
|
|
||||||
glBlitFramebuffer(
|
glBlitFramebuffer(
|
||||||
0, 0, texWidth, texHeight,
|
0, 0, texWidth, texHeight,
|
||||||
|
@ -419,11 +423,11 @@ XFBSourceBase* FramebufferManager::CreateXFBSource(unsigned int target_width, un
|
||||||
glGenTextures(1, &texture);
|
glGenTextures(1, &texture);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0 + 9);
|
glActiveTexture(GL_TEXTURE0 + 9);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, target_width, target_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, target_width, target_height, m_EFBLayers, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
|
||||||
|
|
||||||
return new XFBSource(texture);
|
return new XFBSource(texture, m_EFBLayers);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc)
|
void FramebufferManager::GetTargetSize(unsigned int *width, unsigned int *height, const EFBRectangle& sourceRc)
|
||||||
|
|
|
@ -47,13 +47,14 @@ namespace OGL
|
||||||
|
|
||||||
struct XFBSource : public XFBSourceBase
|
struct XFBSource : public XFBSourceBase
|
||||||
{
|
{
|
||||||
XFBSource(GLuint tex) : texture(tex) {}
|
XFBSource(GLuint tex, int layers) : texture(tex), m_layers(layers) {}
|
||||||
~XFBSource();
|
~XFBSource();
|
||||||
|
|
||||||
void CopyEFB(float Gamma) override;
|
void CopyEFB(float Gamma) override;
|
||||||
void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) override;
|
void DecodeToTexture(u32 xfbAddr, u32 fbWidth, u32 fbHeight) override;
|
||||||
|
|
||||||
const GLuint texture;
|
const GLuint texture;
|
||||||
|
const int m_layers;
|
||||||
};
|
};
|
||||||
|
|
||||||
class FramebufferManager : public FramebufferManagerBase
|
class FramebufferManager : public FramebufferManagerBase
|
||||||
|
@ -100,6 +101,7 @@ private:
|
||||||
static int m_msaaSamples;
|
static int m_msaaSamples;
|
||||||
|
|
||||||
static GLenum m_textureType;
|
static GLenum m_textureType;
|
||||||
|
static int m_EFBLayers;
|
||||||
|
|
||||||
static GLuint m_efbFramebuffer;
|
static GLuint m_efbFramebuffer;
|
||||||
static GLuint m_xfbFramebuffer;
|
static GLuint m_xfbFramebuffer;
|
||||||
|
|
|
@ -206,6 +206,10 @@ static void GLAPIENTRY ClearDepthf(GLfloat depthval)
|
||||||
{
|
{
|
||||||
glClearDepth(depthval);
|
glClearDepth(depthval);
|
||||||
}
|
}
|
||||||
|
static void GLAPIENTRY FramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)
|
||||||
|
{
|
||||||
|
glFramebufferTextureLayer(target, attachment, texture, level, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void InitDriverInfo()
|
static void InitDriverInfo()
|
||||||
{
|
{
|
||||||
|
@ -462,6 +466,11 @@ Renderer::Renderer()
|
||||||
glClearDepthf = ClearDepthf;
|
glClearDepthf = ClearDepthf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!(GLExtensions::Version() >= 320))
|
||||||
|
{
|
||||||
|
glFramebufferTexture = FramebufferTexture;
|
||||||
|
}
|
||||||
|
|
||||||
g_Config.backend_info.bSupportsDualSourceBlend = GLExtensions::Supports("GL_ARB_blend_func_extended");
|
g_Config.backend_info.bSupportsDualSourceBlend = GLExtensions::Supports("GL_ARB_blend_func_extended");
|
||||||
g_Config.backend_info.bSupportsPrimitiveRestart = !DriverDetails::HasBug(DriverDetails::BUG_PRIMITIVERESTART) &&
|
g_Config.backend_info.bSupportsPrimitiveRestart = !DriverDetails::HasBug(DriverDetails::BUG_PRIMITIVERESTART) &&
|
||||||
((GLExtensions::Version() >= 310) || GLExtensions::Supports("GL_NV_primitive_restart"));
|
((GLExtensions::Version() >= 310) || GLExtensions::Supports("GL_NV_primitive_restart"));
|
||||||
|
|
|
@ -98,14 +98,14 @@ void TextureCache::TCacheEntry::Bind(unsigned int stage)
|
||||||
s_ActiveTexture = stage;
|
s_ActiveTexture = stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
|
||||||
s_Textures[stage] = texture;
|
s_Textures[stage] = texture;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TextureCache::TCacheEntry::Save(const std::string& filename, unsigned int level)
|
bool TextureCache::TCacheEntry::Save(const std::string& filename, unsigned int level)
|
||||||
{
|
{
|
||||||
return SaveTexture(filename, GL_TEXTURE_2D, texture, virtual_width, virtual_height, level);
|
return SaveTexture(filename, GL_TEXTURE_2D_ARRAY, texture, virtual_width, virtual_height, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width,
|
TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width,
|
||||||
|
@ -172,8 +172,8 @@ TextureCache::TCacheEntryBase* TextureCache::CreateTexture(unsigned int width,
|
||||||
entry.pcfmt = pcfmt;
|
entry.pcfmt = pcfmt;
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0+9);
|
glActiveTexture(GL_TEXTURE0+9);
|
||||||
glBindTexture(GL_TEXTURE_2D, entry.texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, entry.texture);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, tex_levels - 1);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, tex_levels - 1);
|
||||||
|
|
||||||
entry.Load(width, height, expanded_width, 0);
|
entry.Load(width, height, expanded_width, 0);
|
||||||
|
|
||||||
|
@ -189,12 +189,12 @@ void TextureCache::TCacheEntry::Load(unsigned int width, unsigned int height,
|
||||||
if (pcfmt != PC_TEX_FMT_DXT1)
|
if (pcfmt != PC_TEX_FMT_DXT1)
|
||||||
{
|
{
|
||||||
glActiveTexture(GL_TEXTURE0+9);
|
glActiveTexture(GL_TEXTURE0+9);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
|
||||||
|
|
||||||
if (expanded_width != width)
|
if (expanded_width != width)
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, expanded_width);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, expanded_width);
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, level, gl_iformat, width, height, 0, gl_format, gl_type, temp);
|
glTexImage3D(GL_TEXTURE_2D_ARRAY, level, gl_iformat, width, height, 1, 0, gl_format, gl_type, temp);
|
||||||
|
|
||||||
if (expanded_width != width)
|
if (expanded_width != width)
|
||||||
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
@ -213,21 +213,23 @@ TextureCache::TCacheEntryBase* TextureCache::CreateRenderTargetTexture(
|
||||||
{
|
{
|
||||||
TCacheEntry *const entry = new TCacheEntry;
|
TCacheEntry *const entry = new TCacheEntry;
|
||||||
glActiveTexture(GL_TEXTURE0+9);
|
glActiveTexture(GL_TEXTURE0+9);
|
||||||
glBindTexture(GL_TEXTURE_2D, entry->texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, entry->texture);
|
||||||
|
|
||||||
const GLenum
|
const GLenum
|
||||||
gl_format = GL_RGBA,
|
gl_format = GL_RGBA,
|
||||||
gl_iformat = GL_RGBA,
|
gl_iformat = GL_RGBA,
|
||||||
gl_type = GL_UNSIGNED_BYTE;
|
gl_type = GL_UNSIGNED_BYTE;
|
||||||
|
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
|
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, gl_iformat, scaled_tex_w, scaled_tex_h, 0, gl_format, gl_type, nullptr);
|
int layers = 1;
|
||||||
glBindTexture(GL_TEXTURE_2D, 0);
|
|
||||||
|
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, gl_iformat, scaled_tex_w, scaled_tex_h, layers, 0, gl_format, gl_type, nullptr);
|
||||||
|
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
|
||||||
|
|
||||||
glGenFramebuffers(1, &entry->framebuffer);
|
glGenFramebuffers(1, &entry->framebuffer);
|
||||||
FramebufferManager::SetFramebuffer(entry->framebuffer);
|
FramebufferManager::SetFramebuffer(entry->framebuffer);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, entry->texture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, entry->texture, 0);
|
||||||
|
|
||||||
SetStage();
|
SetStage();
|
||||||
|
|
||||||
|
@ -251,7 +253,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
FramebufferManager::SetFramebuffer(framebuffer);
|
FramebufferManager::SetFramebuffer(framebuffer);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0+9);
|
glActiveTexture(GL_TEXTURE0+9);
|
||||||
glBindTexture(GL_TEXTURE_2D, read_texture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, read_texture);
|
||||||
|
|
||||||
glViewport(0, 0, virtual_width, virtual_height);
|
glViewport(0, 0, virtual_width, virtual_height);
|
||||||
|
|
||||||
|
@ -309,7 +311,7 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
{
|
{
|
||||||
static int count = 0;
|
static int count = 0;
|
||||||
SaveTexture(StringFromFormat("%sefb_frame_%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(),
|
SaveTexture(StringFromFormat("%sefb_frame_%i.png", File::GetUserPath(D_DUMPTEXTURES_IDX).c_str(),
|
||||||
count++), GL_TEXTURE_2D, texture, virtual_width, virtual_height, 0);
|
count++), GL_TEXTURE_2D_ARRAY, texture, virtual_width, virtual_height, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_renderer->RestoreAPIState();
|
g_renderer->RestoreAPIState();
|
||||||
|
@ -318,25 +320,25 @@ void TextureCache::TCacheEntry::FromRenderTarget(u32 dstAddr, unsigned int dstFo
|
||||||
TextureCache::TextureCache()
|
TextureCache::TextureCache()
|
||||||
{
|
{
|
||||||
const char *pColorMatrixProg =
|
const char *pColorMatrixProg =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"uniform vec4 colmat[7];\n"
|
"uniform vec4 colmat[7];\n"
|
||||||
"in vec2 uv0;\n"
|
"in vec2 uv0;\n"
|
||||||
"out vec4 ocol0;\n"
|
"out vec4 ocol0;\n"
|
||||||
"\n"
|
"\n"
|
||||||
"void main(){\n"
|
"void main(){\n"
|
||||||
" vec4 texcol = texture(samp9, uv0);\n"
|
" vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n"
|
||||||
" texcol = round(texcol * colmat[5]) * colmat[6];\n"
|
" texcol = round(texcol * colmat[5]) * colmat[6];\n"
|
||||||
" ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n"
|
" ocol0 = texcol * mat4(colmat[0], colmat[1], colmat[2], colmat[3]) + colmat[4];\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
const char *pDepthMatrixProg =
|
const char *pDepthMatrixProg =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"uniform vec4 colmat[5];\n"
|
"uniform vec4 colmat[5];\n"
|
||||||
"in vec2 uv0;\n"
|
"in vec2 uv0;\n"
|
||||||
"out vec4 ocol0;\n"
|
"out vec4 ocol0;\n"
|
||||||
"\n"
|
"\n"
|
||||||
"void main(){\n"
|
"void main(){\n"
|
||||||
" vec4 texcol = texture(samp9, uv0);\n"
|
" vec4 texcol = texture(samp9, vec3(uv0, 0.0));\n"
|
||||||
|
|
||||||
// 255.99998474121 = 16777215/16777216*256
|
// 255.99998474121 = 16777215/16777216*256
|
||||||
" float workspace = texcol.x * 255.99998474121;\n"
|
" float workspace = texcol.x * 255.99998474121;\n"
|
||||||
|
@ -364,12 +366,12 @@ TextureCache::TextureCache()
|
||||||
|
|
||||||
const char *VProgram =
|
const char *VProgram =
|
||||||
"out vec2 uv0;\n"
|
"out vec2 uv0;\n"
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"uniform vec4 copy_position;\n" // left, top, right, bottom
|
"uniform vec4 copy_position;\n" // left, top, right, bottom
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
||||||
" uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0));\n"
|
" uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n"
|
||||||
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
|
|
|
@ -72,21 +72,21 @@ static void CreatePrograms()
|
||||||
const char *VProgramRgbToYuyv =
|
const char *VProgramRgbToYuyv =
|
||||||
"out vec2 uv0;\n"
|
"out vec2 uv0;\n"
|
||||||
"uniform vec4 copy_position;\n" // left, top, right, bottom
|
"uniform vec4 copy_position;\n" // left, top, right, bottom
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
" vec2 rawpos = vec2(gl_VertexID&1, gl_VertexID&2);\n"
|
||||||
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
" gl_Position = vec4(rawpos*2.0-1.0, 0.0, 1.0);\n"
|
||||||
" uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0));\n"
|
" uv0 = mix(copy_position.xy, copy_position.zw, rawpos) / vec2(textureSize(samp9, 0).xy);\n"
|
||||||
"}\n";
|
"}\n";
|
||||||
const char *FProgramRgbToYuyv =
|
const char *FProgramRgbToYuyv =
|
||||||
"SAMPLER_BINDING(9) uniform sampler2D samp9;\n"
|
"SAMPLER_BINDING(9) uniform sampler2DArray samp9;\n"
|
||||||
"in vec2 uv0;\n"
|
"in vec2 uv0;\n"
|
||||||
"out vec4 ocol0;\n"
|
"out vec4 ocol0;\n"
|
||||||
"void main()\n"
|
"void main()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" vec3 c0 = texture(samp9, (uv0 - dFdx(uv0) * 0.25)).rgb;\n"
|
" vec3 c0 = texture(samp9, vec3(uv0 - dFdx(uv0) * 0.25, 0.0)).rgb;\n"
|
||||||
" vec3 c1 = texture(samp9, (uv0 + dFdx(uv0) * 0.25)).rgb;\n"
|
" vec3 c1 = texture(samp9, vec3(uv0 + dFdx(uv0) * 0.25, 0.0)).rgb;\n"
|
||||||
" vec3 c01 = (c0 + c1) * 0.5;\n"
|
" vec3 c01 = (c0 + c1) * 0.5;\n"
|
||||||
" vec3 y_const = vec3(0.257,0.504,0.098);\n"
|
" vec3 y_const = vec3(0.257,0.504,0.098);\n"
|
||||||
" vec3 u_const = vec3(-0.148,-0.291,0.439);\n"
|
" vec3 u_const = vec3(-0.148,-0.291,0.439);\n"
|
||||||
|
@ -224,17 +224,17 @@ static void EncodeToRamUsingShader(GLuint srcTexture,
|
||||||
|
|
||||||
// set source texture
|
// set source texture
|
||||||
glActiveTexture(GL_TEXTURE0+9);
|
glActiveTexture(GL_TEXTURE0+9);
|
||||||
glBindTexture(GL_TEXTURE_2D, srcTexture);
|
glBindTexture(GL_TEXTURE_2D_ARRAY, srcTexture);
|
||||||
|
|
||||||
if (linearFilter)
|
if (linearFilter)
|
||||||
{
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
}
|
}
|
||||||
|
|
||||||
glViewport(0, 0, (GLsizei)dstWidth, (GLsizei)dstHeight);
|
glViewport(0, 0, (GLsizei)dstWidth, (GLsizei)dstHeight);
|
||||||
|
@ -365,7 +365,7 @@ void DecodeToTexture(u32 xfbAddr, int srcWidth, int srcHeight, GLuint destTextur
|
||||||
// switch to texture converter frame buffer
|
// switch to texture converter frame buffer
|
||||||
// attach destTexture as color destination
|
// attach destTexture as color destination
|
||||||
FramebufferManager::SetFramebuffer(s_texConvFrameBuffer[1]);
|
FramebufferManager::SetFramebuffer(s_texConvFrameBuffer[1]);
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
|
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, destTexture, 0);
|
||||||
|
|
||||||
// activate source texture
|
// activate source texture
|
||||||
// set srcAddr as data for source texture
|
// set srcAddr as data for source texture
|
||||||
|
|
|
@ -206,7 +206,7 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T
|
||||||
{
|
{
|
||||||
// Declare samplers
|
// Declare samplers
|
||||||
for (int i = 0; i < 8; ++i)
|
for (int i = 0; i < 8; ++i)
|
||||||
out.Write("SAMPLER_BINDING(%d) uniform sampler2D samp%d;\n", i, i);
|
out.Write("SAMPLER_BINDING(%d) uniform sampler2DArray samp%d;\n", i, i);
|
||||||
}
|
}
|
||||||
else // D3D
|
else // D3D
|
||||||
{
|
{
|
||||||
|
@ -931,7 +931,7 @@ static inline void SampleTexture(T& out, const char *texcoords, const char *texs
|
||||||
if (ApiType == API_D3D)
|
if (ApiType == API_D3D)
|
||||||
out.Write("iround(255.0 * Tex%d.Sample(samp%d,%s.xy * " I_TEXDIMS"[%d].xy)).%s;\n", texmap,texmap, texcoords, texmap, texswap);
|
out.Write("iround(255.0 * Tex%d.Sample(samp%d,%s.xy * " I_TEXDIMS"[%d].xy)).%s;\n", texmap,texmap, texcoords, texmap, texswap);
|
||||||
else
|
else
|
||||||
out.Write("iround(255.0 * texture(samp%d,%s.xy * " I_TEXDIMS"[%d].xy)).%s;\n", texmap, texcoords, texmap, texswap);
|
out.Write("iround(255.0 * texture(samp%d, float3(%s.xy * " I_TEXDIMS"[%d].xy, 0.0))).%s;\n", texmap, texcoords, texmap, texswap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *tevAlphaFuncsTable[] =
|
static const char *tevAlphaFuncsTable[] =
|
||||||
|
|
|
@ -70,7 +70,7 @@ static void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
||||||
if (ApiType == API_OPENGL)
|
if (ApiType == API_OPENGL)
|
||||||
{
|
{
|
||||||
WRITE(p, "#define samp0 samp9\n");
|
WRITE(p, "#define samp0 samp9\n");
|
||||||
WRITE(p, "SAMPLER_BINDING(9) uniform sampler2D samp0;\n");
|
WRITE(p, "SAMPLER_BINDING(9) uniform sampler2DArray samp0;\n");
|
||||||
|
|
||||||
WRITE(p, " out vec4 ocol0;\n");
|
WRITE(p, " out vec4 ocol0;\n");
|
||||||
WRITE(p, "void main()\n");
|
WRITE(p, "void main()\n");
|
||||||
|
@ -120,7 +120,7 @@ static void WriteSwizzler(char*& p, u32 format, API_TYPE ApiType)
|
||||||
|
|
||||||
static void WriteSampleColor(char*& p, const char* colorComp, const char* dest, int xoffset, API_TYPE ApiType)
|
static void WriteSampleColor(char*& p, const char* colorComp, const char* dest, int xoffset, API_TYPE ApiType)
|
||||||
{
|
{
|
||||||
WRITE(p, " %s = texture(samp0, uv0 + float2(%d, 0) * sample_offset).%s;\n",
|
WRITE(p, " %s = texture(samp0, float3(uv0 + float2(%d, 0) * sample_offset, 0.0)).%s;\n",
|
||||||
dest, xoffset, colorComp
|
dest, xoffset, colorComp
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue