mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-29 23:06:23 -05:00
gl_rasterizer: Move code to bind framebuffer surfaces before draw to its own function.
This commit is contained in:
parent
d30110348b
commit
c33abac275
2 changed files with 31 additions and 22 deletions
|
@ -263,28 +263,7 @@ void RasterizerOpenGL::DrawArrays() {
|
||||||
surfaces_rect.bottom, surfaces_rect.top))}; // Bottom
|
surfaces_rect.bottom, surfaces_rect.top))}; // Bottom
|
||||||
|
|
||||||
// Bind the framebuffer surfaces
|
// Bind the framebuffer surfaces
|
||||||
state.draw.draw_framebuffer = framebuffer.handle;
|
BindFramebufferSurfaces(color_surface, depth_surface, has_stencil);
|
||||||
state.Apply();
|
|
||||||
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
|
||||||
color_surface != nullptr ? color_surface->texture.handle : 0, 0);
|
|
||||||
if (depth_surface != nullptr) {
|
|
||||||
if (has_stencil) {
|
|
||||||
// attach both depth and stencil
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
|
|
||||||
depth_surface->texture.handle, 0);
|
|
||||||
} else {
|
|
||||||
// attach depth
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
|
|
||||||
depth_surface->texture.handle, 0);
|
|
||||||
// clear stencil attachment
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// clear both depth and stencil attachment
|
|
||||||
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0,
|
|
||||||
0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sync the viewport
|
// Sync the viewport
|
||||||
SyncViewport(surfaces_rect, res_scale);
|
SyncViewport(surfaces_rect, res_scale);
|
||||||
|
@ -530,6 +509,32 @@ void main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RasterizerOpenGL::BindFramebufferSurfaces(const Surface& color_surface,
|
||||||
|
const Surface& depth_surface, bool has_stencil) {
|
||||||
|
state.draw.draw_framebuffer = framebuffer.handle;
|
||||||
|
state.Apply();
|
||||||
|
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
|
||||||
|
color_surface != nullptr ? color_surface->texture.handle : 0, 0);
|
||||||
|
if (depth_surface != nullptr) {
|
||||||
|
if (has_stencil) {
|
||||||
|
// attach both depth and stencil
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
|
||||||
|
depth_surface->texture.handle, 0);
|
||||||
|
} else {
|
||||||
|
// attach depth
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
|
||||||
|
depth_surface->texture.handle, 0);
|
||||||
|
// clear stencil attachment
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// clear both depth and stencil attachment
|
||||||
|
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RasterizerOpenGL::SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale) {
|
void RasterizerOpenGL::SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale) {
|
||||||
const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
|
const auto& regs = Core::System().GetInstance().GPU().Maxwell3D().regs;
|
||||||
const MathUtil::Rectangle<s32> viewport_rect{regs.viewport[0].GetRect()};
|
const MathUtil::Rectangle<s32> viewport_rect{regs.viewport[0].GetRect()};
|
||||||
|
|
|
@ -87,6 +87,10 @@ public:
|
||||||
private:
|
private:
|
||||||
struct SamplerInfo {};
|
struct SamplerInfo {};
|
||||||
|
|
||||||
|
/// Binds the framebuffer color and depth surface
|
||||||
|
void BindFramebufferSurfaces(const Surface& color_surface, const Surface& depth_surface,
|
||||||
|
bool has_stencil);
|
||||||
|
|
||||||
/// Syncs the viewport to match the guest state
|
/// Syncs the viewport to match the guest state
|
||||||
void SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale);
|
void SyncViewport(const MathUtil::Rectangle<u32>& surfaces_rect, u16 res_scale);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue