mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-12 01:38:29 +12:00
"Intel legacy mode" was a special mode to workaround various Intel OpenGL driver limitations during the earlier years of Cemu. It's been unmaintained for years and no longer serves a purpose. If we ever bring back compatibility with ancient Intel GPUs it should be done in a more structured way than a blunt yes/no flag.
176 lines
6.8 KiB
C++
176 lines
6.8 KiB
C++
#pragma once
|
|
|
|
#include "Cafe/HW/Latte/Core/Latte.h"
|
|
#include "Cafe/HW/Latte/Core/LatteCachedFBO.h"
|
|
#include "Cafe/HW/Latte/Renderer/RendererShader.h"
|
|
#include "Cafe/HW/Latte/Core/LatteTextureLoader.h"
|
|
#include "Cafe/HW/Latte/Core/LatteTextureReadbackInfo.h"
|
|
#include "Cafe/HW/Latte/Core/LatteQueryObject.h"
|
|
#include "Cafe/HW/Latte/Renderer/RendererOuputShader.h"
|
|
|
|
#if BOOST_OS_WINDOWS
|
|
#include "util/DXGIWrapper/DXGIWrapper.h"
|
|
#endif
|
|
|
|
// imgui forward declarations
|
|
struct ImFontAtlas;
|
|
struct ImGuiContext;
|
|
|
|
enum class GfxVendor
|
|
{
|
|
Generic,
|
|
|
|
AMD,
|
|
Intel,
|
|
Nvidia,
|
|
Apple,
|
|
Mesa,
|
|
|
|
MAX
|
|
};
|
|
|
|
enum class RendererAPI
|
|
{
|
|
OpenGL,
|
|
Vulkan,
|
|
|
|
MAX
|
|
};
|
|
|
|
using ImTextureID = void*;
|
|
|
|
class Renderer
|
|
{
|
|
public:
|
|
enum class INDEX_TYPE
|
|
{
|
|
NONE,
|
|
U16,
|
|
U32
|
|
};
|
|
|
|
virtual ~Renderer() = default;
|
|
|
|
virtual RendererAPI GetType() = 0;
|
|
|
|
virtual void Initialize();
|
|
virtual void Shutdown();
|
|
virtual bool IsPadWindowActive() = 0;
|
|
|
|
virtual bool GetVRAMInfo(int& usageInMB, int& totalInMB) const;
|
|
|
|
virtual void EnableDebugMode() {}
|
|
|
|
virtual void ClearColorbuffer(bool padView) = 0;
|
|
virtual void DrawEmptyFrame(bool mainWindow) = 0;
|
|
virtual void SwapBuffers(bool swapTV, bool swapDRC) = 0;
|
|
|
|
virtual void HandleScreenshotRequest(LatteTextureView* texView, bool padView){}
|
|
|
|
virtual void DrawBackbufferQuad(LatteTextureView* texView, RendererOutputShader* shader, bool useLinearTexFilter,
|
|
sint32 imageX, sint32 imageY, sint32 imageWidth, sint32 imageHeight,
|
|
bool padView, bool clearBackground) = 0;
|
|
virtual bool BeginFrame(bool mainWindow) = 0;
|
|
|
|
// flush control
|
|
virtual void Flush(bool waitIdle = false) = 0; // called when explicit flush is required (e.g. by imgui)
|
|
virtual void NotifyLatteCommandProcessorIdle() = 0; // called when command processor has no more commands available or when stalled
|
|
|
|
// imgui
|
|
virtual bool ImguiBegin(bool mainWindow);
|
|
virtual void ImguiEnd() = 0;
|
|
virtual ImTextureID GenerateTexture(const std::vector<uint8>& data, const Vector2i& size) = 0;
|
|
virtual void DeleteTexture(ImTextureID id) = 0;
|
|
virtual void DeleteFontTextures() = 0;
|
|
|
|
GfxVendor GetVendor() const { return m_vendor; }
|
|
virtual void AppendOverlayDebugInfo() = 0;
|
|
|
|
// rendertarget
|
|
virtual void renderTarget_setViewport(float x, float y, float width, float height, float nearZ, float farZ, bool halfZ = false) = 0;
|
|
virtual void renderTarget_setScissor(sint32 scissorX, sint32 scissorY, sint32 scissorWidth, sint32 scissorHeight) = 0;
|
|
|
|
virtual LatteCachedFBO* rendertarget_createCachedFBO(uint64 key) = 0;
|
|
virtual void rendertarget_deleteCachedFBO(LatteCachedFBO* fbo) = 0;
|
|
virtual void rendertarget_bindFramebufferObject(LatteCachedFBO* cfbo) = 0;
|
|
|
|
// texture functions
|
|
virtual void* texture_acquireTextureUploadBuffer(uint32 size) = 0;
|
|
virtual void texture_releaseTextureUploadBuffer(uint8* mem) = 0;
|
|
|
|
virtual TextureDecoder* texture_chooseDecodedFormat(Latte::E_GX2SURFFMT format, bool isDepth, Latte::E_DIM dim, uint32 width, uint32 height) = 0;
|
|
|
|
virtual void texture_clearSlice(LatteTexture* hostTexture, sint32 sliceIndex, sint32 mipIndex) = 0;
|
|
virtual void texture_loadSlice(LatteTexture* hostTexture, sint32 width, sint32 height, sint32 depth, void* pixelData, sint32 sliceIndex, sint32 mipIndex, uint32 compressedImageSize) = 0;
|
|
virtual void texture_clearColorSlice(LatteTexture* hostTexture, sint32 sliceIndex, sint32 mipIndex, float r, float g, float b, float a) = 0;
|
|
virtual void texture_clearDepthSlice(LatteTexture* hostTexture, uint32 sliceIndex, sint32 mipIndex, bool clearDepth, bool clearStencil, float depthValue, uint32 stencilValue) = 0;
|
|
|
|
virtual LatteTexture* texture_createTextureEx(Latte::E_DIM dim, MPTR physAddress, MPTR physMipAddress, Latte::E_GX2SURFFMT format, uint32 width, uint32 height, uint32 depth, uint32 pitch, uint32 mipLevels, uint32 swizzle, Latte::E_HWTILEMODE tileMode, bool isDepth) = 0;
|
|
|
|
virtual void texture_setLatteTexture(LatteTextureView* textureView, uint32 textureUnit) = 0;
|
|
virtual void texture_copyImageSubData(LatteTexture* src, sint32 srcMip, sint32 effectiveSrcX, sint32 effectiveSrcY, sint32 srcSlice, LatteTexture* dst, sint32 dstMip, sint32 effectiveDstX, sint32 effectiveDstY, sint32 dstSlice, sint32 effectiveCopyWidth, sint32 effectiveCopyHeight, sint32 srcDepth) = 0;
|
|
|
|
virtual LatteTextureReadbackInfo* texture_createReadback(LatteTextureView* textureView) = 0;
|
|
|
|
// surface copy
|
|
virtual void surfaceCopy_copySurfaceWithFormatConversion(LatteTexture* sourceTexture, sint32 srcMip, sint32 srcSlice, LatteTexture* destinationTexture, sint32 dstMip, sint32 dstSlice, sint32 width, sint32 height) = 0;
|
|
|
|
// buffer cache
|
|
virtual void bufferCache_init(const sint32 bufferSize) = 0;
|
|
virtual void bufferCache_upload(uint8* buffer, sint32 size, uint32 bufferOffset) = 0;
|
|
virtual void bufferCache_copy(uint32 srcOffset, uint32 dstOffset, uint32 size) = 0;
|
|
virtual void bufferCache_copyStreamoutToMainBuffer(uint32 srcOffset, uint32 dstOffset, uint32 size) = 0;
|
|
|
|
virtual void buffer_bindVertexBuffer(uint32 bufferIndex, uint32 offset, uint32 size) = 0;
|
|
virtual void buffer_bindUniformBuffer(LatteConst::ShaderType shaderType, uint32 bufferIndex, uint32 offset, uint32 size) = 0;
|
|
|
|
// shader
|
|
virtual RendererShader* shader_create(RendererShader::ShaderType type, uint64 baseHash, uint64 auxHash, const std::string& source, bool compileAsync, bool isGfxPackSource) = 0;
|
|
|
|
// streamout
|
|
virtual void streamout_setupXfbBuffer(uint32 bufferIndex, sint32 ringBufferOffset, uint32 rangeAddr, uint32 rangeSize) = 0;
|
|
virtual void streamout_begin() = 0;
|
|
virtual void streamout_rendererFinishDrawcall() = 0;
|
|
|
|
// core drawing logic
|
|
virtual void draw_beginSequence() = 0;
|
|
virtual void draw_execute(uint32 baseVertex, uint32 baseInstance, uint32 instanceCount, uint32 count, MPTR indexDataMPTR, Latte::LATTE_VGT_DMA_INDEX_TYPE::E_INDEX_TYPE indexType, bool isFirst) = 0;
|
|
virtual void draw_endSequence() = 0;
|
|
|
|
// index
|
|
virtual void* indexData_reserveIndexMemory(uint32 size, uint32& offset, uint32& bufferIndex) = 0;
|
|
virtual void indexData_uploadIndexMemory(uint32 offset, uint32 size) = 0;
|
|
|
|
// occlusion queries
|
|
virtual LatteQueryObject* occlusionQuery_create() = 0;
|
|
virtual void occlusionQuery_destroy(LatteQueryObject* queryObj) = 0;
|
|
virtual void occlusionQuery_flush() = 0;
|
|
virtual void occlusionQuery_updateState() = 0;
|
|
|
|
protected:
|
|
virtual void GetVendorInformation() { }
|
|
GfxVendor m_vendor = GfxVendor::Generic;
|
|
|
|
static uint8 SRGBComponentToRGB(uint8 ci);
|
|
static uint8 RGBComponentToSRGB(uint8 cli);
|
|
|
|
enum class ScreenshotState
|
|
{
|
|
None,
|
|
Main,
|
|
Pad,
|
|
};
|
|
ScreenshotState m_screenshot_state = ScreenshotState::None;
|
|
void SaveScreenshot(const std::vector<uint8>& rgb_data, int width, int height, bool mainWindow) const;
|
|
|
|
|
|
ImFontAtlas* imguiFontAtlas{};
|
|
ImGuiContext* imguiTVContext{};
|
|
ImGuiContext* imguiPadContext{};
|
|
|
|
#if BOOST_OS_WINDOWS
|
|
std::unique_ptr<DXGIWrapper> m_dxgi_wrapper{};
|
|
#endif
|
|
};
|
|
|
|
extern std::unique_ptr<Renderer> g_renderer;
|