From 6971dc2f689ce2d8147b8c999ad17c4c78b5f642 Mon Sep 17 00:00:00 2001 From: weihuoya Date: Fri, 9 Apr 2021 17:59:05 +0800 Subject: [PATCH] fx issues --- src/android/app/src/main/AndroidManifest.xml | 3 +- .../java/org/citra/emu/NativeLibrary.java | 2 + .../org/citra/emu/overlay/ResizeOverlay.java | 2 +- .../citra/emu/settings/SettingsFragment.java | 4 -- .../org/citra/emu/ui/EmulationActivity.java | 10 ++- .../org/citra/emu/ui/EmulationFragment.java | 2 +- .../java/org/citra/emu/ui/MainActivity.java | 11 +++ .../emu/utils/DirectoryInitialization.java | 6 +- src/android/jni/egl_android.cpp | 10 +++ src/android/jni/egl_android.h | 1 + src/android/jni/main_android.cpp | 9 ++- .../renderer_opengl/renderer_opengl.cpp | 71 ++++++++----------- src/video_core/video_core.cpp | 48 +++++++------ 13 files changed, 104 insertions(+), 75 deletions(-) diff --git a/src/android/app/src/main/AndroidManifest.xml b/src/android/app/src/main/AndroidManifest.xml index 799085a294e..ecf73d0bbb7 100644 --- a/src/android/app/src/main/AndroidManifest.xml +++ b/src/android/app/src/main/AndroidManifest.xml @@ -35,6 +35,8 @@ @@ -89,7 +91,6 @@ diff --git a/src/android/app/src/main/java/org/citra/emu/NativeLibrary.java b/src/android/app/src/main/java/org/citra/emu/NativeLibrary.java index 23ffa35c52c..83b33d298c4 100644 --- a/src/android/app/src/main/java/org/citra/emu/NativeLibrary.java +++ b/src/android/app/src/main/java/org/citra/emu/NativeLibrary.java @@ -283,6 +283,8 @@ public static void addNetPlayMessage(int type, String message) { public static native void SurfaceDestroyed(); + public static native void WindowChanged(); + public static native void DoFrame(); public static native void Run(String path); diff --git a/src/android/app/src/main/java/org/citra/emu/overlay/ResizeOverlay.java b/src/android/app/src/main/java/org/citra/emu/overlay/ResizeOverlay.java index 358356364e8..cfe1890135c 100644 --- a/src/android/app/src/main/java/org/citra/emu/overlay/ResizeOverlay.java +++ b/src/android/app/src/main/java/org/citra/emu/overlay/ResizeOverlay.java @@ -77,7 +77,7 @@ public void setRect(Rect rect) { points[3].x = rect.left; points[3].y = rect.bottom; - if (mListener != null) { + if (getVisibility() == VISIBLE && mListener != null) { mListener.onResize(this); } } diff --git a/src/android/app/src/main/java/org/citra/emu/settings/SettingsFragment.java b/src/android/app/src/main/java/org/citra/emu/settings/SettingsFragment.java index 8a774a66abb..1fc94a49a28 100644 --- a/src/android/app/src/main/java/org/citra/emu/settings/SettingsFragment.java +++ b/src/android/app/src/main/java/org/citra/emu/settings/SettingsFragment.java @@ -195,10 +195,6 @@ private ArrayList loadSettingsList() { R.string.setting_system_language, 0, R.array.languageNames, R.array.languageValues, 1, language)); - sl.add(new SingleChoiceSetting(SettingsFile.KEY_SYSTEM_LANGUAGE, Settings.SECTION_INI_CORE, - R.string.setting_system_language, 0, - R.array.languageNames, R.array.languageValues, 1, - language)); // theme stringValues = getThemeValues(); diff --git a/src/android/app/src/main/java/org/citra/emu/ui/EmulationActivity.java b/src/android/app/src/main/java/org/citra/emu/ui/EmulationActivity.java index 5b5e8c8b648..2dd9bde0f60 100644 --- a/src/android/app/src/main/java/org/citra/emu/ui/EmulationActivity.java +++ b/src/android/app/src/main/java/org/citra/emu/ui/EmulationActivity.java @@ -56,7 +56,7 @@ protected Map doInBackground(Context... contexts) { settings.loadSettings(mGameId); SettingSection section = settings.getSection(Settings.SECTION_INI_CORE); Setting setting = section.getSetting(SettingsFile.KEY_THEME_PACKAGE); - String theme = setting.getValueAsString(); + String theme = setting != null ? setting.getValueAsString() : ""; return DirectoryInitialization.loadInputOverlay(contexts[0], theme); } @@ -111,8 +111,6 @@ protected void onCreate(Bundle savedInstanceState) { mGamePath = savedInstanceState.getString(EXTRA_GAME_PATH); } - hideSystemUI(); - // Find or create the EmulationFragment mEmulationFragment = (EmulationFragment)getSupportFragmentManager().findFragmentById( R.id.fragment_emulation); @@ -153,6 +151,12 @@ public void onBackPressed() { } } + @Override + protected void onResume() { + super.onResume(); + hideSystemUI(); + } + private void hideSystemUI() { getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN diff --git a/src/android/app/src/main/java/org/citra/emu/ui/EmulationFragment.java b/src/android/app/src/main/java/org/citra/emu/ui/EmulationFragment.java index 591a46fedc7..f5e818814cc 100644 --- a/src/android/app/src/main/java/org/citra/emu/ui/EmulationFragment.java +++ b/src/android/app/src/main/java/org/citra/emu/ui/EmulationFragment.java @@ -238,7 +238,7 @@ public void onGlobalLayout() { EmulationActivity activity = (EmulationActivity)getActivity(); activity.updateDisplayConfig(); activity.updateBackgroundImage(); - NativeLibrary.SurfaceChanged(mSurface); + NativeLibrary.WindowChanged(); mResizeOverlayTop.setRect(NativeLibrary.getCustomLayout(true)); mResizeOverlayBottom.setRect(NativeLibrary.getCustomLayout(false)); observer.removeOnGlobalLayoutListener(this); diff --git a/src/android/app/src/main/java/org/citra/emu/ui/MainActivity.java b/src/android/app/src/main/java/org/citra/emu/ui/MainActivity.java index 0047d15a71d..43c570456cf 100644 --- a/src/android/app/src/main/java/org/citra/emu/ui/MainActivity.java +++ b/src/android/app/src/main/java/org/citra/emu/ui/MainActivity.java @@ -8,6 +8,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.AsyncTask; @@ -24,6 +25,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -316,6 +318,15 @@ public void onRequestPermissionsResult(int requestCode, String[] permissions, } } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + //mAdapter.notifyDataSetChanged(); + int columns = getResources().getInteger(R.integer.game_grid_columns); + RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, columns); + mGameListView.setLayoutManager(layoutManager); + } + private void loadTitleDB() { String lan = Locale.getDefault().getLanguage(); if (lan.equals("zh")) { diff --git a/src/android/app/src/main/java/org/citra/emu/utils/DirectoryInitialization.java b/src/android/app/src/main/java/org/citra/emu/utils/DirectoryInitialization.java index 774e294cf7b..0eca90c95ee 100644 --- a/src/android/app/src/main/java/org/citra/emu/utils/DirectoryInitialization.java +++ b/src/android/app/src/main/java/org/citra/emu/utils/DirectoryInitialization.java @@ -173,7 +173,11 @@ public static void saveInputOverlay(Context context) { ZipEntry entry = new ZipEntry(inputNames[i]); zipOut.putNextEntry(entry); Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), inputIds[i]); - bitmap.compress(Bitmap.CompressFormat.PNG, 90, zipOut); + Bitmap.CompressFormat format = Bitmap.CompressFormat.PNG; + if (inputNames[i].endsWith(".jpg")) { + format = Bitmap.CompressFormat.JPEG; + } + bitmap.compress(format, 90, zipOut); } zipOut.close(); } catch (IOException e) { diff --git a/src/android/jni/egl_android.cpp b/src/android/jni/egl_android.cpp index d3a673c1308..d8b97ca0e48 100644 --- a/src/android/jni/egl_android.cpp +++ b/src/android/jni/egl_android.cpp @@ -103,6 +103,16 @@ void EGLAndroid::UpdateSurface(ANativeWindow* surface) { StopPresenting(); } +void EGLAndroid::UpdateWindow() { + window_width = ANativeWindow_getWidth(host_window); + window_height = ANativeWindow_getHeight(host_window); + safe_inset_left = static_cast(NativeLibrary::GetSafeInsetLeft()); + safe_inset_top = static_cast(NativeLibrary::GetSafeInsetTop()); + safe_inset_right = static_cast(NativeLibrary::GetSafeInsetRight()); + safe_inset_bottom = static_cast(NativeLibrary::GetSafeInsetBottom()); + UpdateLayout(); +} + void EGLAndroid::UpdateLayout() { UpdateFramebufferLayout(window_width, window_height); } diff --git a/src/android/jni/egl_android.h b/src/android/jni/egl_android.h index 014c9e03b8b..e965abf2e8c 100644 --- a/src/android/jni/egl_android.h +++ b/src/android/jni/egl_android.h @@ -17,6 +17,7 @@ class EGLAndroid : public Frontend::EmuWindow { bool Initialize(ANativeWindow* surface); void UpdateSurface(ANativeWindow* surface); + void UpdateWindow(); void UpdateLayout(); void MakeCurrent() override; diff --git a/src/android/jni/main_android.cpp b/src/android/jni/main_android.cpp index cdaecc2ccb5..409b224a16c 100644 --- a/src/android/jni/main_android.cpp +++ b/src/android/jni/main_android.cpp @@ -286,6 +286,13 @@ JNIEXPORT void JNICALL Java_org_citra_emu_NativeLibrary_SurfaceDestroyed(JNIEnv* } } +JNIEXPORT void JNICALL Java_org_citra_emu_NativeLibrary_WindowChanged(JNIEnv* env, jclass obj) { + if (s_render_window) { + UpdateDisplayRotation(); + s_render_window->UpdateWindow(); + } +} + JNIEXPORT void JNICALL Java_org_citra_emu_NativeLibrary_DoFrame(JNIEnv* env, jclass obj) { if (!s_is_running || s_stop_running) { return; @@ -528,7 +535,7 @@ JNIEXPORT void JNICALL Java_org_citra_emu_NativeLibrary_setRunningSettings(JNIEn // Frame Limit Settings::values.frame_limit = settings[i++] * 2; - s_render_window->UpdateLayout(); + VideoCore::SettingUpdate(); env->ReleaseIntArrayElements(array, settings, 0); } diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 15e6b8fb49f..6d08cc2f93d 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -212,9 +212,7 @@ void main() { static const char fragment_shader[] = R"( in vec2 frag_tex_coord; out vec4 color; - uniform sampler2D color_texture; - void main() { color = texture(color_texture, frag_tex_coord); } @@ -529,42 +527,34 @@ void RendererOpenGL::LoadBackgroundImage(u32* pixels, u32 width, u32 height) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); OpenGLState::BindTexture2D(0, old_tex); - LoadBackgroundShader(); } void RendererOpenGL::LoadBackgroundShader() { - if (!bg_shader.handle) { - std::string frag_source; - if (GLES) { - frag_source = fragment_shader_precision_OES; - frag_source += fragment_shader; - } else { - frag_source = fragment_shader; - } - bg_shader.Create(vertex_shader, frag_source.c_str()); + const char bg_vertex_shader[] = R"( +out vec2 frag_tex_coord; +void main() { + vec2 rawpos = vec2(gl_VertexID & 1, (gl_VertexID & 2) >> 1); + frag_tex_coord = vec2(rawpos.x, rawpos.y); + mat2 rotate = mat2(0, -1, 1, 0); // rotate -90กใ + gl_Position = vec4((rawpos * 2.0 - 1.0) * rotate, 0.0, 1.0); +} +)"; + const char bg_fragment_shader[] = R"( +in vec2 frag_tex_coord; +out vec4 color; +layout(binding = 0) uniform sampler2D color_texture; +void main() { + color = texture(color_texture, frag_tex_coord); +} +)"; + std::string frag_source; + if (GLES) { + frag_source = fragment_shader_precision_OES; + frag_source += bg_fragment_shader; + } else { + frag_source = bg_fragment_shader; } - - OpenGLState::BindShaderProgram(bg_shader.handle); - GLuint modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix"); - GLuint color_texture = glGetUniformLocation(shader.handle, "color_texture"); - GLuint attrib_position = glGetAttribLocation(shader.handle, "vert_position"); - GLuint attrib_tex_coord = glGetAttribLocation(shader.handle, "vert_tex_coord"); - - // Set projection matrix - auto layout = render_window.GetFramebufferLayout(); - std::array ortho_matrix = MakeOrthographicMatrix(layout.width, layout.height); - glUniformMatrix3x2fv(modelview_matrix, 1, GL_FALSE, ortho_matrix.data()); - - // Bind texture in Texture Unit 0 - glUniform1i(color_texture, 0); - - // Attach vertex data to VAO - glVertexAttribPointer(attrib_position, 2, GL_FLOAT, GL_FALSE, sizeof(ScreenRectVertex), - (GLvoid*)offsetof(ScreenRectVertex, position)); - glVertexAttribPointer(attrib_tex_coord, 2, GL_FLOAT, GL_FALSE, sizeof(ScreenRectVertex), - (GLvoid*)offsetof(ScreenRectVertex, tex_coord)); - glEnableVertexAttribArray(attrib_position); - glEnableVertexAttribArray(attrib_tex_coord); + bg_shader.Create(bg_vertex_shader, frag_source.c_str()); } /** @@ -710,12 +700,12 @@ void RendererOpenGL::InitOpenGLObjects() { uniform_modelview_matrix = glGetUniformLocation(shader.handle, "modelview_matrix"); uniform_resolution = glGetUniformLocation(shader.handle, "resolution"); - GLuint uniform_color_texture = glGetUniformLocation(shader.handle, "color_texture"); + GLuint color_texture = glGetUniformLocation(shader.handle, "color_texture"); GLuint attrib_position = glGetAttribLocation(shader.handle, "vert_position"); GLuint attrib_tex_coord = glGetAttribLocation(shader.handle, "vert_tex_coord"); // Bind texture in Texture Unit 0 - glUniform1i(uniform_color_texture, 0); + glUniform1i(color_texture, 0); // Attach vertex data to VAO glVertexAttribPointer(attrib_position, 2, GL_FLOAT, GL_FALSE, sizeof(ScreenRectVertex), @@ -857,7 +847,7 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout) { const auto& bottom_screen = layout.bottom_screen; const auto& bottom_texcoords = screen_infos[2].display_texcoords; - const std::array vertices = {{ + const std::array vertices = {{ // top screen ScreenRectVertex(top_screen.left, top_screen.top, top_texcoords.bottom, top_texcoords.left), ScreenRectVertex(top_screen.left, top_screen.top + top_screen.GetHeight(), @@ -877,11 +867,6 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout) { ScreenRectVertex(bottom_screen.left + bottom_screen.GetWidth(), bottom_screen.top + bottom_screen.GetHeight(), bottom_texcoords.top, bottom_texcoords.right), - // background - ScreenRectVertex(0, 0, 1, 1), - ScreenRectVertex(0, layout.height, 0, 1), - ScreenRectVertex(layout.width, 0, 1, 0), - ScreenRectVertex(layout.width, layout.height, 0, 0), }}; // prefer `glBufferData` than `glBufferSubData` on mobile device glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices.data(), GL_STREAM_DRAW); @@ -889,7 +874,7 @@ void RendererOpenGL::DrawScreens(const Layout::FramebufferLayout& layout) { // background GLuint handle = OpenGLState::BindShaderProgram(bg_shader.handle); OpenGLState::BindTexture2D(0, bg_texture.handle); - glDrawArrays(GL_TRIANGLE_STRIP, 8, 4); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); OpenGLState::BindShaderProgram(handle); if (layout.top_screen_enabled) { diff --git a/src/video_core/video_core.cpp b/src/video_core/video_core.cpp index bafd5d8ebdc..3807e08b142 100644 --- a/src/video_core/video_core.cpp +++ b/src/video_core/video_core.cpp @@ -22,6 +22,7 @@ namespace VideoCore { static std::unique_ptr g_renderer; static std::unique_ptr g_rasterizer; static Memory::MemorySystem* g_memory = nullptr; +static bool g_setting_update = false; static u16 g_scale_factor = 1; static u32 g_current_frame = 0; @@ -33,6 +34,26 @@ std::atomic g_hw_shader_enabled; std::function& pixels)> g_screenshot_complete_callback; +static void ApplySetting() { + Frontend::EmuWindow& window = g_renderer->GetRenderWindow(); + const Layout::FramebufferLayout& layout = window.GetFramebufferLayout(); + window.UpdateFramebufferLayout(layout.width, layout.height); + + if (Settings::values.use_hw_renderer) { + g_scale_factor = Settings::values.resolution_factor + ? Settings::values.resolution_factor + : window.GetFramebufferLayout().GetScalingRatio(); + } else { + // Software renderer always render at native resolution + g_scale_factor = 1; + } + + g_rasterizer->CheckForConfigChanges(); + g_hw_shader_enabled = Settings::values.use_hw_shader; + + g_setting_update = false; +} + /// Initialize the video core ResultStatus Init(Frontend::EmuWindow& window, Memory::MemorySystem& memory) { g_memory = &memory; @@ -46,7 +67,7 @@ ResultStatus Init(Frontend::EmuWindow& window, Memory::MemorySystem& memory) { } else { g_rasterizer = std::make_unique(); } - SettingUpdate(); + ApplySetting(); g_current_frame = 0; } else { g_renderer.reset(); @@ -83,28 +104,15 @@ void FrameUpdate() { g_background_width = 0; g_background_height = 0; } -} -void SettingUpdate() { - if (!g_renderer) { - return; - } - - Frontend::EmuWindow& window = g_renderer->GetRenderWindow(); - const Layout::FramebufferLayout& layout = window.GetFramebufferLayout(); - window.UpdateFramebufferLayout(layout.width, layout.height); - - if (Settings::values.use_hw_renderer) { - g_scale_factor = Settings::values.resolution_factor - ? Settings::values.resolution_factor - : window.GetFramebufferLayout().GetScalingRatio(); - } else { - // Software renderer always render at native resolution - g_scale_factor = 1; + // settings + if (g_setting_update) { + ApplySetting(); } +} - g_rasterizer->CheckForConfigChanges(); - g_hw_shader_enabled = Settings::values.use_hw_shader; +void SettingUpdate() { + g_setting_update = (g_renderer != nullptr); } u16 GetResolutionScaleFactor() {