* rasterizer_cache: Remove custom texture code
* It's a hacky buggy mess, will be reimplemented later when the cache is in a better state
* rasterizer_cache: Refactor surface upload/download
* Switch to the texture_codec header which was written as part of the vulkan backend by steveice and me
* Move most of the upload logic to the rasterizer cache and out of the surface object
* Scaled uploads/downloads have been disabled for now since they require more runtime infrastructure
* rasterizer_cache: Refactor runtime interface
* Remove aspect enum which is the same as SurfaceType
* Replace Subresource with specific structures for each operation (blit/copy/clear). This mimics moderns APIs vulkan much better
* Pass the surface to the runtime instead of the texture
* Implement CopyTextures with glCopyImageSubData which is available on 4.3 and gles.
This function also has an overload for cubes which will be removed later.
* rasterizer_cache: Move texture allocation to the runtime
* renderer_opengl: Remove TextureDownloaderES
* It's overly compilcated and unused at the moment. Will be replaced with a simple compute shader in a later commit
* rasterizer_cache: Split CachedSurface
* This commit splits CachedSurface into two classes, SurfaceBase which contains the backend agnostic functions and Surface which is the opengl specific part
* For now the cache uses the opengl surface directly and there are a few ugly casts with watchers, those will be taken care of when the template convertion and watcher removal are added respectively
* rasterizer_cache: Move reinterpreters to the runtime
* rasterizer_cache: Move some pixel format function to the cpp file
* rasterizer_cache: Common texture acceleration functions
* They don't contain any backend specific code so they shouldn't be duplicated
* rasterizer_cache: Remove BlitSurfaces
* It's better to prefer copy/blit in the caller anyway
* rasterizer_cache: Only allocate needed levels
* rasterizer_cache: Move texture runtime out of common dir
* Also shorten the util header filename
* surface_params: Cleanup code
* Add more comments, organize it a bit etc
* rasterizer_cache: Move texture filtering to the runtime
* rasterizer_cache: Move to VideoCore
* renderer_opengl: Reimplement scaled uploads/downloads
* Instead of looking up for temporary textures, each allocation now contains both a scaled and unscaled handle
This allows the scale operations to be done inside the surface object itself and improves performance in general
* In particular the scaled download code has been expanded to use ARB_get_texture_sub_image when possible
which is faster and more convenient than glReadPixels. The latter is still relevant for OpenGLES though.
* Finally allocations are now given a handy debug name that can be viewed from renderdoc.
* rasterizer_cache: Remove global state
* gl_rasterizer: Abstract common draw operations to Framebuffer
* This also allows to cache framebuffer objects instead of always swapping the textures, something that particularly benefits mali gpus
* rasterizer_cache: Implement multi-level surfaces
* With this commit the cache can now directly upload and use mipmaps
without needing to sync them with watchers. By using native mimaps
directly this also adds support for mipmap for cube
* Texture cubes have also been updated to drop the watcher requirement
* host_shaders: Add CMake integration for string shaders
* Improves build time shader generation making it much less prone to errors.
Also moves the presentation shaders here to avoid embedding them to the cpp file.
* Texture filter shaders now make explicit use of uniform bindings for better vulkan compatibility
* renderer_opengl: Emulate lod bias in the shader
* This way opengles can emulate it correctly
* gl_rasterizer: Respect GL_MAX_TEXTURE_BUFFER_SIZE
* Older Bifrost Mali GPUs only support up to 64kb texture buffers. Citra would try to allocate a much larger buffer the first 64kb of which would work fine but after that the driver starts misbehaving and showing various graphical glitches
* rasterizer_cache: Cleanup CopySurface
* renderer_opengl: Keep frames synchronized when using a GPU debugger
* rasterizer_cache: Rename Surface to SurfaceRef
* Makes it clear that surface is a shared_ptr and not an object
* rasterizer_cache: Cleanup
* Move constructor to the top of the file
* Move FindMatch to the top as well and remove the Invalid flag which was redudant;
all FindMatch calls used it expect from MatchFlags::Copy which ignores it anyway
* gl_texture_runtime: Make driver const
* gl_texture_runtime: Fix RGB8 format handling
* The texture_codec header, being written with vulkan in mind converts RGB8 to RGBA8. The backend wasn't adjusted to account for this though and treated the data as RGB8.
* Also remove D16 convertions, both opengl and vulkan are required to support this format so these are not needed
* gl_texture_runtime: Reduce state switches during FBO blits
* glBlitFramebuffer is only affected by the scissor rectangle so just disable scissor testing instead of resetting our entire state
* surface_params: Prevent texcopy that spans multiple levels
* It would have failed before as well, with multi-level surfaces it triggers the assert though
* renderer_opengl: Centralize texture filters
* A lot of code is shared between the filters thus is makes it sense to centralize them
* Also fix an issue with partial texture uploads
* Address review comments
* rasterizer_cache: Use leading return types
* rasterizer_cache: Cleanup null checks
* renderer_opengl: Add additional logging
* externals: Actually downgrade glad
* For some reason I missed adding the files to git
* surface_params: Do not check for levels in exact match
* Some games will try to use the base level of a multi level surface. Checking for levels forces another surface to be created and a copy to be made which is both unncessary and breaks custom textures
---------
Co-authored-by: bunnei <bunneidev@gmail.com>
The incorrect background color could appear when the games fragment is not initialized as it is during first boot. Now it appears correctly as colorSurface.
Some versions of clang 14 (macOS+android) don't implement
`string_view(It first, It last)`, so let's use
`string_view(const CharT*, size_type)` instead.
Also remove unused header leftover from old code that uses std::string.
* citra_qt: Check if renderer is null
* core: Fix dynarmic use-after-free error
* bootmanager: Add current context check in DoneCurrent
* Loading a save state would destroy the frame dumper class, which contains a shared context. That context would call DoneCurrent without checking if it was actually bound or not, resulting in crashes when calling opengl functions
* externals: Correct glad readme
* common: Log renderer debug setting
* citra: Make lambda lower case
* Consistency with review comments on the PR
* video_core: Kill more global state
* GetResolutionScaleFactor would be called somewhere in the renderer constructor chain but it relies on the yet unitialized g_renderer, resulting in crashes when the resolution scale is set to auto. Rather than adding a workaround, let's kill this global state to fix this for good
Since the HIO request is basically treated like a syscall, we need to
stop emulation while waiting for the GDB client to reply with the
result. This ensures any memory queries etc. that GDB makes to fulfill
the HIO request are accessing memory as it was at the time of the
request, instead of afterwards.
This also does kind of a hacky way of sending HIO requests, since we
don't have a direct way of signaling a request should be sent like the
Rosalina implementation.
To improve this, it could probably do some kind of signal sending which
the main run loop handles instead of GDBStub::HandlePacket();
* externals: Update dynarmic
* settings: Introduce GraphicsAPI enum
* For now it's OpenGL only but will be expanded upon later
* citra_qt: Introduce backend agnostic context management
* Mostly a direct port from yuzu
* core: Simplify context acquire
* settings: Add option to create debug contexts
* renderer_opengl: Abstract initialization to Driver
* This commit also updates glad and adds some useful extensions which we will use in part 2
* Rasterizer construction is moved to the specific renderer instead of RendererBase.
Software rendering has been disable to achieve this but will be brought back in the next commit.
* video_core: Remove Init/Shutdown methods from renderer
* The constructor and destructor can do the same job
* In addition move opengl function loading to Qt since SDL already does this. Also remove ErrorVideoCore which is never reached
* citra_qt: Decouple software renderer from opengl part 1
* citra: Decouple software renderer from opengl part 2
* android: Decouple software renderer from opengl part 3
* swrasterizer: Decouple software renderer from opengl part 4
* This commit simply enforces the renderer naming conventions in the software renderer
* video_core: Move RendererBase to VideoCore
* video_core: De-globalize screenshot state
* video_core: Pass system to the renderers
* video_core: Commonize shader uniform data
* video_core: Abstract backend agnostic rasterizer operations
* bootmanager: Remove references to OpenGL for macOS
OpenGL macOS headers definitions clash heavily with each other
* citra_qt: Proper title for api settings
* video_core: Reduce boost usage
* bootmanager: Fix hide mouse option
Remove event handlers from RenderWidget for events that are
already handled by the parent GRenderWindow.
Also enable mouse tracking on the RenderWidget.
* android: Remove software from graphics api list
* code: Address review comments
* citra: Port per-game settings read
* Having to update the default value for all backends is a pain so lets centralize it
* android: Rename to OpenGLES
---------
Co-authored-by: MerryMage <MerryMage@users.noreply.github.com>
Co-authored-by: Vitor Kiguchi <vitor-kiguchi@hotmail.com>
* citra-qt config: small misc changes
Remove unused ReadSettingGlobal
Remove unused WriteSetting overload
ReadGlobalSetting: rename default value variable
* qt config: fix u16 values being written as QMetaType
* qt config: rework post processing shader setting
handles post processing setting properly when per-game settings are used.
the anaglyph shader is given its own setting, separate from the post
processing name.
* qt config: use u32 instead of unsigned int when casting
The 3D toggle does not behave correctly as it does not have some
special logic from the enhancements configuration UI that determines
the post-processing shader defaults to use. Because of that, plus
an uptick in people seemingly accidentally enabling 3D options and
not being sure why Citra is rendering differently, just remove the
new UI components for now until better ideas for 3D control can
be worked out.
* apt: Implement additional library applet state management.
* kernel: Clear process handle table on exit.
* apt: Implement system applet commands.
* apt: Pop MediaType from command buffers with correct size.
* apt: Improve accuracy of parameters and HLE applet lifecycle.
* apt: General cleanup.
* file_sys: Make system save data open error code more correct.
Not sure if this is the exact right error code, but it's at least
more correct than before as Game Notes will now create its system
save data instead of throwing a fatal error.
* apt: Fix launching New 3DS Internet Browser.
* frd: Correct fix to GetMyScreenName response.
Qt isn't always writing changes on save. This causes config to be lost on crash. This PR ensures all changes are always saved on the file.
Ported from yuzu.
Co-authored-by: Narr the Reg <5944268+german77@users.noreply.github.com>
* Get value for swap screen setting and check mono_render_option again
* resolve clang-format issue
* do not disable opengl blending since it is enabled by default
* reset blending state to default values after drawing second screen
* prevent resetting state blending when custom opacity is not used
* Services/APT: Implemented PrepareToStartApplication and StartApplication.
This allows games to be launched from the Home Menu, however, there is still a bug with the GSP where the Home Menu doesn't release the GPU rights. It is unknown if the Home Menu should terminate itself after launching a new application.
To get the Home Menu to not hang when launching stuff, you need to have config block 0xF0006 (size 40 flags 8) in your config savegame, it doesn't matter if it's filled with zeros.
* Services/APT: Implement WakeupApplication.
With this, the Home Menu is now able to launch games when using an LLE NIM imlementation.
* Services/APT: Reset the app_start_parameters after launching the application with StartApplication.
* Services/APT: Simplify the StartApplication code by directly calling WakeupApplication.
---------
Co-authored-by: Subv <subv2112@gmail.com>
It seems like the menu isn't showing up for users on Android 13.
We're not sure what's wrong, and the approach we've been using for the
menu hasn't been entirely reliable in the past either (in particular
not on non-mobile form factors like Chromebooks and VR devices),
so let's make it possible to open the menu by pressing Back,
an action that works reliably on most kinds of Android devices.
(Not sure if there's an equivalent of Back on devices like watches,
but I think we can pretty safely ignore those for now.)
* This fixes#6041 by changing OnCoreError. Instead of there being an "Abort/Continue" prompt when a savestate fails to save or load, it just brings up a warning box.
I also changed "Abort/Continue" to "Quit Game/Continue" for better clarity
* Fixed formatting
This prevents the keyboard from being stuck in an open state if the user
slides the panel while focused on a text box. Now it closes gracefully.
Co-authored-by: Charles Lombardo <clombardo169@gmail.com>
... In Qt 5.15+ the QImage will not accept non-natively handled pixel
formats anymore. We can however use the newly added conversion method
provided in `QVideoFrame` to convert it to `QImage` instead
* Initial plugin loader support
* More plugin loader progress
* Organize code and more plugin features
* Fix clang-format
* Fix compilation and add android gui
* Fix clang-format
* Fix macos build
* Fix copy-paste bug and clang-format
* More merge fixes
* Make suggestions
* Move global variable to static member
* Fix typo
* Apply suggestions
* Proper initialization order
* Allocate plugin memory from SYSTEM instead of APPLICATION
* Do not mark free pages as RWX
* Fix plugins in old 3DS mode.
* Implement KernelSetState and notif 0x203
* Apply changes
* Remove unused variable
* Fix dynarmic commit
* Sublicense files with MIT License
* Remove non-ascii characters from license
* common: Move settings to common from core.
- Removes a dependency on core and input_common from common.
* code: Wrap settings values
* Port from yuzu to allow per game settings
* citra_qt: Initial per-game settings dialog
* citra_qt: Use new API for read/save of config values
* citra_qt: Per game audio settings
* citra_qt: Per game graphics settings
* citra_qt: Per game system settings
* citra_qt: Per game general settings
* citra_qt: Document and run clang format
* citra_qt: Make icon smaller and centered
* citra_qt: Remove version number
* Not sure how to extract that, can always add it back later
* citra_qt: Wrap UISettings
* citra_qt: Fix unthottled fps setting
* citra_qt: Remove margin in emulation tab
* citra_qt: Implement some suggestions
* Bring back speed switch hotkey
* Allow configuration when game is running
* Rename/adjust UI stuff
* citra_qt: Fix build with separate windows
* citra_qt: Address feedback
* citra_qt: Log per-game settings before launching games
* citra_qt: Add shader cache options
* Also fix android build
* citra_qt: Add DLC menu option
* citra_qt: Run clang-format
* citra_qt: Adjust for time offset
* citra_qt: Implement suggestions
* Run clang-format
Co-authored-by: bunnei <bunneidev@gmail.com>
* Add setting for system time offset
Add a setting to displace citra system time by days, hours, minutes
or seconds
Add UI for the setting which is only visible when clock is set to
system time
Change core/settings.h to include the setting
* Add system time offset to kernel
Actually makes use of the time offset.
* Fix time offset calculatioon in core/movie.cpp
* Replace C++20 chrono::days with seconds
Hopefully fixes the build.
* Fix socket poll and handling in windows
* Fix clang
* Add guest timing adjust
* Use platform independent time fetch
* Use proper type in time_point
* Fix ambiguous function call
* Do suggestions
* Take cpu_clock_scale into account in tick adjust
xbyak is intended to be installed in /usr/local/include/xbyak.
Since we desire not to install xbyak before using it, we copy the headers
to the appropriate directory structure and use that instead
Co-authored-by: merry <git@mary.rs>
previous changes had forced every single user to use custom
directories for NAND and SDMC. Those paths were saved to the
config file and would interact badly with portable builds.
Games will sometimes use these when representing open right bounds
and so disallowing it caused regressions, with a notable example
being when MemoryFill is called to the end of vram, causing an
"invalid end address" error.
This had been noted on a comment in GetPhysicalRef prior to the
regression.
Reported by GillianMC on Discord. Looks to be a small quirk in the QT API.
setText(QObject::tr(status.text));
bringing up QObject breaks the link with the GameListItemCompat
If a shutdown was requested by the application, close the SDL window,
initiating the normal shutdown procedure. This causes a graceful exit
process instead of hanging.
* AMDs new driver fixed many issues in the OpenGL driver. No reason to
keep these hacks. In addition the upgrade to 4.3 guarantees the
existance of required extensions, so no need to check for them
* The current backend heavily depends on many extensions for shadow
rendering and texture cubes in the fragment shaders. All these
extensions were incorporated to core in 4.3. Support is practically
ubiquitous and requiring support for it makes things a lot easier
* This commit aims to both continue the rasterizer cache cleanup by
separating CachedSurface into a dedicated header and to start weeding
out the raw OpenGL code from the cache.
* The latter is achieved by abstracting most texture operations in a new
class called TextureRuntime. This has many benefits such as making it easier
to port the functionality to other graphics APIs and the removal of the need
to pass (read/draw) framebuffer handles everywhere. The filterer and
reinterpreter get their own sets of FBOs due to this, something that
might be a performance win since it reduces the state switching
overhead on the runtime FBOs.
The JNI functions that have "UTF" their name use "modified UTF-8"
rather than the standard UTF-8 that Citra uses, at least according
to Oracle's documentation, so it is incorrect for us to use them.
This change fixes the problem by converting between UTF-8 and
UTF-16 manually instead of letting JNI do it for us.
Resolves#6077
If only `SDL_INIT_JOYSTICK` is used, `InputCommon::SDL::SDLState` later tries to initialize the game controller in a background thread, which on macOS causes a crash in `SDL_PumpEvents`. From [the SDL docs](https://wiki.libsdl.org/SDL_Init), `SDL_INIT_GAMECONTROLLER` implies `SDL_INIT_JOYSTICK`, so this should be a total superset of the previous behavior.