corregit postfx en windows

This commit is contained in:
2026-03-21 17:55:18 +01:00
parent 43a6cc2d7a
commit 9df3f1b929
6 changed files with 1061 additions and 52 deletions

View File

@@ -129,7 +129,7 @@ void Screen::render() {
// En el path SDL3GPU, los píxeles se suben directamente desde la Surface.
// En el path SDL_Renderer, primero copiamos la surface a la SDL_Texture.
if (!(Options::video.postfx && shader_backend_ && shader_backend_->isHardwareAccelerated())) {
if (!(shader_backend_ && shader_backend_->isHardwareAccelerated())) {
surfaceToTexture();
}
@@ -209,17 +209,25 @@ void Screen::renderNotifications() const {
// Cambia el estado del PostFX
void Screen::togglePostFX() {
Options::video.postfx = !Options::video.postfx;
if (!Options::video.postfx && shader_backend_) {
// Al desactivar PostFX, limpiar el backend para liberar el swapchain de GPU
shader_backend_->cleanup();
if (shader_backend_ && shader_backend_->isHardwareAccelerated()) {
if (Options::video.postfx) {
applyCurrentPostFXPreset();
} else {
// Pass-through: efectos a 0, el shader copia la textura sin modificar
shader_backend_->setPostFXParams(Rendering::PostFXParams{});
}
} else {
// Backend no inicializado aún — inicializarlo ahora
initShaders();
}
}
// Recarga el shader del preset actual sin toggle
void Screen::reloadPostFX() {
if (Options::video.postfx) {
if (Options::video.postfx && shader_backend_ && shader_backend_->isHardwareAccelerated()) {
// El backend ya está activo: solo actualizar uniforms, sin recrear el pipeline
applyCurrentPostFXPreset();
} else if (Options::video.postfx) {
initShaders();
}
}
@@ -323,8 +331,8 @@ void Screen::surfaceToTexture() {
void Screen::textureToRenderer() {
SDL_Texture* texture_to_render = Options::video.border.enabled ? border_texture_ : game_texture_;
if (Options::video.postfx && shader_backend_ && shader_backend_->isHardwareAccelerated()) {
// ---- SDL3 GPU path: convertir Surface → ARGB → upload → PostFX → present ----
if (shader_backend_ && shader_backend_->isHardwareAccelerated()) {
// ---- SDL3 GPU path: convertir Surface → ARGB → upload → PostFX/pass-through → present ----
if (Options::video.border.enabled) {
// El border_surface_ solo tiene el color de borde; hay que componer encima el game_surface_
const int BORDER_W = static_cast<int>(border_surface_->getWidth());
@@ -452,11 +460,9 @@ void Screen::applyCurrentPostFXPreset() {
}
// Inicializa los shaders
// El device GPU se crea siempre (independientemente de postfx) para evitar
// conflictos SDL_Renderer/SDL_GPU al hacer toggle F4 en Windows/Vulkan.
void Screen::initShaders() {
if (!Options::video.postfx) {
return;
}
SDL_Texture* tex = Options::video.border.enabled ? border_texture_ : game_texture_;
if (!shader_backend_) {
@@ -464,7 +470,12 @@ void Screen::initShaders() {
}
shader_backend_->init(window_, tex, "", "");
applyCurrentPostFXPreset();
if (Options::video.postfx) {
applyCurrentPostFXPreset();
} else {
// Pass-through: todos los efectos a 0, el shader solo copia la textura
shader_backend_->setPostFXParams(Rendering::PostFXParams{});
}
}
// Obtiene información sobre la pantalla