FramebufferManager: Support resolving a multi-layered EFB in D3D.
This commit is contained in:
parent
0ae082fb61
commit
761749e07f
|
@ -29,7 +29,8 @@ D3DTexture2D* &FramebufferManager::GetResolvedEFBColorTexture()
|
||||||
{
|
{
|
||||||
if (g_ActiveConfig.iMultisampleMode)
|
if (g_ActiveConfig.iMultisampleMode)
|
||||||
{
|
{
|
||||||
D3D::context->ResolveSubresource(m_efb.resolved_color_tex->GetTex(), 0, m_efb.color_tex->GetTex(), 0, DXGI_FORMAT_R8G8B8A8_UNORM);
|
for (int i = 0; i < m_efb.slices; i++)
|
||||||
|
D3D::context->ResolveSubresource(m_efb.resolved_color_tex->GetTex(), D3D11CalcSubresource(0, i, 1), m_efb.color_tex->GetTex(), D3D11CalcSubresource(0, i, 1), DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||||
return m_efb.resolved_color_tex;
|
return m_efb.resolved_color_tex;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -40,7 +41,8 @@ D3DTexture2D* &FramebufferManager::GetResolvedEFBDepthTexture()
|
||||||
{
|
{
|
||||||
if (g_ActiveConfig.iMultisampleMode)
|
if (g_ActiveConfig.iMultisampleMode)
|
||||||
{
|
{
|
||||||
D3D::context->ResolveSubresource(m_efb.resolved_depth_tex->GetTex(), 0, m_efb.depth_tex->GetTex(), 0, DXGI_FORMAT_R8G8B8A8_UNORM);
|
for (int i = 0; i < m_efb.slices; i++)
|
||||||
|
D3D::context->ResolveSubresource(m_efb.resolved_depth_tex->GetTex(), D3D11CalcSubresource(0, i, 1), m_efb.depth_tex->GetTex(), D3D11CalcSubresource(0, i, 1), DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||||
return m_efb.resolved_depth_tex;
|
return m_efb.resolved_depth_tex;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -99,17 +99,17 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_textureType = GL_TEXTURE_2D_MULTISAMPLE;
|
m_textureType = GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
|
||||||
GLenum resolvedType = GL_TEXTURE_2D_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.
|
||||||
|
@ -180,25 +180,50 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
|
||||||
// msaa + sample shading available, so just fetch the sample
|
// msaa + sample shading available, so just fetch the sample
|
||||||
// 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 =
|
if (m_EFBLayers > 1)
|
||||||
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
{
|
||||||
"vec4 sampleEFB(ivec2 pos) {\n"
|
sampler =
|
||||||
" return texelFetch(samp9, pos, gl_SampleID);\n"
|
"SAMPLER_BINDING(9) uniform sampler2DMSArray samp9;\n"
|
||||||
"}\n";
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
|
" return texelFetch(samp9, ivec3(pos, 0), gl_SampleID);\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sampler =
|
||||||
|
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
||||||
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
|
" return texelFetch(samp9, pos, gl_SampleID);\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// msaa without sample shading: calculate the mean value of the pixel
|
// msaa without sample shading: calculate the mean value of the pixel
|
||||||
std::stringstream samples;
|
std::stringstream samples;
|
||||||
samples << m_msaaSamples;
|
samples << m_msaaSamples;
|
||||||
sampler =
|
if (m_EFBLayers > 1)
|
||||||
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
{
|
||||||
"vec4 sampleEFB(ivec2 pos) {\n"
|
sampler =
|
||||||
" vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n"
|
"SAMPLER_BINDING(9) uniform sampler2DMSArray samp9;\n"
|
||||||
" for(int i=0; i<" + samples.str() + "; i++)\n"
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
" color += texelFetch(samp9, pos, i);\n"
|
" vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n"
|
||||||
" return color / " + samples.str() + ";\n"
|
" for(int i=0; i<" + samples.str() + "; i++)\n"
|
||||||
"}\n";
|
" color += texelFetch(samp9, ivec3(pos, 0), i);\n"
|
||||||
|
" return color / " + samples.str() + ";\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sampler =
|
||||||
|
"SAMPLER_BINDING(9) uniform sampler2DMS samp9;\n"
|
||||||
|
"vec4 sampleEFB(ivec2 pos) {\n"
|
||||||
|
" vec4 color = vec4(0.0, 0.0, 0.0, 0.0);\n"
|
||||||
|
" for(int i=0; i<" + samples.str() + "; i++)\n"
|
||||||
|
" color += texelFetch(samp9, pos, i);\n"
|
||||||
|
" return color / " + samples.str() + ";\n"
|
||||||
|
"}\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ps_rgba6_to_rgb8 = sampler +
|
std::string ps_rgba6_to_rgb8 = sampler +
|
||||||
|
|
Loading…
Reference in New Issue