citra-emu
/
citra-canary
Archived
1
0
Fork 0

gl_texture_runtime: Implement ARB_clear_texture (#6850)

This commit is contained in:
GPUCode 2023-08-08 01:10:28 +03:00 committed by GitHub
parent a478bedb12
commit ac78b74c45
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 5 deletions

View File

@ -187,7 +187,41 @@ bool TextureRuntime::Reinterpret(Surface& source, Surface& dest,
return true; return true;
} }
bool TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClear& clear) { bool TextureRuntime::ClearTextureWithoutFbo(Surface& surface,
const VideoCore::TextureClear& clear) {
if (!driver.HasArbClearTexture()) {
return false;
}
GLenum format{};
GLenum type{};
switch (surface.type) {
case SurfaceType::Color:
case SurfaceType::Texture:
format = GL_RGBA;
type = GL_FLOAT;
break;
case SurfaceType::Depth:
format = GL_DEPTH_COMPONENT;
type = GL_FLOAT;
break;
case SurfaceType::DepthStencil:
format = GL_DEPTH_STENCIL;
type = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
break;
default:
UNREACHABLE_MSG("Unknown surface type {}", surface.type);
}
glClearTexSubImage(surface.Handle(), clear.texture_level, clear.texture_rect.left,
clear.texture_rect.bottom, 0, clear.texture_rect.GetWidth(),
clear.texture_rect.GetHeight(), 1, format, type, &clear.value);
return true;
}
void TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClear& clear) {
if (ClearTextureWithoutFbo(surface, clear)) {
return;
}
OpenGLState state = OpenGLState::GetCurState(); OpenGLState state = OpenGLState::GetCurState();
state.scissor.enabled = true; state.scissor.enabled = true;
state.scissor.x = clear.texture_rect.left; state.scissor.x = clear.texture_rect.left;
@ -222,10 +256,7 @@ bool TextureRuntime::ClearTexture(Surface& surface, const VideoCore::TextureClea
break; break;
default: default:
UNREACHABLE_MSG("Unknown surface type {}", surface.type); UNREACHABLE_MSG("Unknown surface type {}", surface.type);
return false;
} }
return true;
} }
bool TextureRuntime::CopyTextures(Surface& source, Surface& dest, bool TextureRuntime::CopyTextures(Surface& source, Surface& dest,

View File

@ -59,7 +59,7 @@ public:
bool Reinterpret(Surface& source, Surface& dest, const VideoCore::TextureBlit& blit); bool Reinterpret(Surface& source, Surface& dest, const VideoCore::TextureBlit& blit);
/// Fills the rectangle of the texture with the clear value provided /// Fills the rectangle of the texture with the clear value provided
bool ClearTexture(Surface& surface, const VideoCore::TextureClear& clear); void ClearTexture(Surface& surface, const VideoCore::TextureClear& clear);
/// Copies a rectangle of source to another rectange of dest /// Copies a rectangle of source to another rectange of dest
bool CopyTextures(Surface& source, Surface& dest, const VideoCore::TextureCopy& copy); bool CopyTextures(Surface& source, Surface& dest, const VideoCore::TextureCopy& copy);
@ -76,6 +76,9 @@ private:
return driver; return driver;
} }
/// Fills the rectangle of the surface with the value provided, without an fbo.
bool ClearTextureWithoutFbo(Surface& surface, const VideoCore::TextureClear& clear);
private: private:
const Driver& driver; const Driver& driver;
BlitHelper blit_helper; BlitHelper blit_helper;