mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #8000 from stenzek/more-videocommon-cleanup
Additional cleanup/fixes from VideoCommon merge
This commit is contained in:
@@ -327,7 +327,7 @@ void Renderer::WaitForGPUIdle()
|
||||
D3D::context->Flush();
|
||||
}
|
||||
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc)
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const MathUtil::Rectangle<int>& rc)
|
||||
{
|
||||
if (g_ActiveConfig.stereo_mode != StereoMode::Nvidia3DVision)
|
||||
return ::Renderer::RenderXFBToScreen(texture, rc);
|
||||
|
||||
@@ -67,7 +67,8 @@ public:
|
||||
void Flush() override;
|
||||
void WaitForGPUIdle() override;
|
||||
|
||||
void RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc) override;
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
void OnConfigChanged(u32 bits) override;
|
||||
|
||||
private:
|
||||
|
||||
@@ -132,7 +132,7 @@ void Renderer::WaitForGPUIdle()
|
||||
ExecuteCommandList(true);
|
||||
}
|
||||
|
||||
void Renderer::ClearScreen(const EFBRectangle& rc, bool color_enable, bool alpha_enable,
|
||||
void Renderer::ClearScreen(const MathUtil::Rectangle<int>& rc, bool color_enable, bool alpha_enable,
|
||||
bool z_enable, u32 color, u32 z)
|
||||
{
|
||||
// Use a fast path without the shader if both color/alpha are enabled.
|
||||
|
||||
@@ -52,8 +52,8 @@ public:
|
||||
void Flush() override;
|
||||
void WaitForGPUIdle() override;
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool color_enable, bool alpha_enable, bool z_enable,
|
||||
u32 color, u32 z) override;
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool color_enable, bool alpha_enable,
|
||||
bool z_enable, u32 color, u32 z) override;
|
||||
|
||||
void SetPipeline(const AbstractPipeline* pipeline) override;
|
||||
void SetFramebuffer(AbstractFramebuffer* framebuffer) override;
|
||||
|
||||
@@ -37,8 +37,8 @@ public:
|
||||
u16 BBoxRead(int index) override { return 0; }
|
||||
void BBoxWrite(int index, u16 value) override {}
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,
|
||||
u32 color, u32 z) override
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z) override
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -21,15 +21,17 @@ public:
|
||||
|
||||
protected:
|
||||
void CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params, u32 native_width,
|
||||
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect,
|
||||
bool scale_by_half, bool linear_filter, float y_scale, float gamma, bool clamp_top,
|
||||
bool clamp_bottom, const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
|
||||
const MathUtil::Rectangle<int>& src_rect, bool scale_by_half, bool linear_filter,
|
||||
float y_scale, float gamma, bool clamp_top, bool clamp_bottom,
|
||||
const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
{
|
||||
}
|
||||
|
||||
void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy, const EFBRectangle& src_rect,
|
||||
bool scale_by_half, bool linear_filter, EFBCopyFormat dst_format,
|
||||
bool is_intensity, float gamma, bool clamp_top, bool clamp_bottom,
|
||||
void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
|
||||
const MathUtil::Rectangle<int>& src_rect, bool scale_by_half,
|
||||
bool linear_filter, EFBCopyFormat dst_format, bool is_intensity,
|
||||
float gamma, bool clamp_top, bool clamp_bottom,
|
||||
const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
{
|
||||
}
|
||||
|
||||
@@ -80,6 +80,7 @@ GLVertexFormat::GLVertexFormat(const PortableVertexDeclaration& vtx_decl)
|
||||
|
||||
GLVertexFormat::~GLVertexFormat()
|
||||
{
|
||||
ProgramShaderCache::InvalidateVertexFormatIfBound(VAO);
|
||||
glDeleteVertexArrays(1, &VAO);
|
||||
}
|
||||
} // namespace OGL
|
||||
|
||||
@@ -24,15 +24,16 @@ static GLenum GetGLShaderTypeForStage(ShaderStage stage)
|
||||
}
|
||||
}
|
||||
|
||||
OGLShader::OGLShader(ShaderStage stage, GLenum gl_type, GLuint gl_id)
|
||||
OGLShader::OGLShader(ShaderStage stage, GLenum gl_type, GLuint gl_id, std::string source)
|
||||
: AbstractShader(stage), m_id(ProgramShaderCache::GenerateShaderID()), m_type(gl_type),
|
||||
m_gl_id(gl_id)
|
||||
m_gl_id(gl_id), m_source(std::move(source))
|
||||
{
|
||||
}
|
||||
|
||||
OGLShader::OGLShader(GLuint gl_compute_program_id)
|
||||
OGLShader::OGLShader(GLuint gl_compute_program_id, std::string source)
|
||||
: AbstractShader(ShaderStage::Compute), m_id(ProgramShaderCache::GenerateShaderID()),
|
||||
m_type(GL_COMPUTE_SHADER), m_gl_compute_program_id(gl_compute_program_id)
|
||||
m_type(GL_COMPUTE_SHADER), m_gl_compute_program_id(gl_compute_program_id),
|
||||
m_source(std::move(source))
|
||||
{
|
||||
}
|
||||
|
||||
@@ -47,22 +48,22 @@ OGLShader::~OGLShader()
|
||||
std::unique_ptr<OGLShader> OGLShader::CreateFromSource(ShaderStage stage, const char* source,
|
||||
size_t length)
|
||||
{
|
||||
std::string source_str(source, length);
|
||||
if (stage != ShaderStage::Compute)
|
||||
{
|
||||
GLenum shader_type = GetGLShaderTypeForStage(stage);
|
||||
GLuint shader_id =
|
||||
ProgramShaderCache::CompileSingleShader(shader_type, std::string(source, length));
|
||||
GLuint shader_id = ProgramShaderCache::CompileSingleShader(shader_type, source_str);
|
||||
if (!shader_id)
|
||||
return nullptr;
|
||||
|
||||
return std::make_unique<OGLShader>(stage, shader_type, shader_id);
|
||||
return std::make_unique<OGLShader>(stage, shader_type, shader_id, std::move(source_str));
|
||||
}
|
||||
|
||||
// Compute shaders.
|
||||
SHADER prog;
|
||||
if (!ProgramShaderCache::CompileComputeShader(prog, std::string(source, length)))
|
||||
if (!ProgramShaderCache::CompileComputeShader(prog, source_str))
|
||||
return nullptr;
|
||||
return std::make_unique<OGLShader>(prog.glprogid);
|
||||
return std::make_unique<OGLShader>(prog.glprogid, std::move(source_str));
|
||||
}
|
||||
|
||||
} // namespace OGL
|
||||
|
||||
@@ -16,14 +16,15 @@ namespace OGL
|
||||
class OGLShader final : public AbstractShader
|
||||
{
|
||||
public:
|
||||
explicit OGLShader(ShaderStage stage, GLenum gl_type, GLuint gl_id);
|
||||
explicit OGLShader(GLuint gl_compute_program_id);
|
||||
explicit OGLShader(ShaderStage stage, GLenum gl_type, GLuint gl_id, std::string source);
|
||||
explicit OGLShader(GLuint gl_compute_program_id, std::string source);
|
||||
~OGLShader() override;
|
||||
|
||||
u64 GetID() const { return m_id; }
|
||||
GLenum GetGLShaderType() const { return m_type; }
|
||||
GLuint GetGLShaderID() const { return m_gl_id; }
|
||||
GLuint GetGLComputeProgramID() const { return m_gl_compute_program_id; }
|
||||
const std::string& GetSource() const { return m_source; }
|
||||
|
||||
static std::unique_ptr<OGLShader> CreateFromSource(ShaderStage stage, const char* source,
|
||||
size_t length);
|
||||
@@ -33,6 +34,7 @@ private:
|
||||
GLenum m_type;
|
||||
GLuint m_gl_id = 0;
|
||||
GLuint m_gl_compute_program_id = 0;
|
||||
std::string m_source;
|
||||
};
|
||||
|
||||
} // namespace OGL
|
||||
|
||||
@@ -267,73 +267,6 @@ void ProgramShaderCache::UploadConstants(const void* data, u32 data_size)
|
||||
ADDSTAT(stats.thisFrame.bytesUniformStreamed, data_size);
|
||||
}
|
||||
|
||||
bool ProgramShaderCache::CompileShader(SHADER& shader, const std::string& vcode,
|
||||
const std::string& pcode, const std::string& gcode)
|
||||
{
|
||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||
if (g_ActiveConfig.iLog & CONF_SAVESHADERS)
|
||||
{
|
||||
static int counter = 0;
|
||||
std::string filename =
|
||||
StringFromFormat("%svs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++);
|
||||
SaveData(filename, vcode.c_str());
|
||||
|
||||
filename = StringFromFormat("%sps_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++);
|
||||
SaveData(filename, pcode.c_str());
|
||||
|
||||
if (!gcode.empty())
|
||||
{
|
||||
filename =
|
||||
StringFromFormat("%sgs_%04i.txt", File::GetUserPath(D_DUMP_IDX).c_str(), counter++);
|
||||
SaveData(filename, gcode.c_str());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
shader.vsid = CompileSingleShader(GL_VERTEX_SHADER, vcode);
|
||||
shader.psid = CompileSingleShader(GL_FRAGMENT_SHADER, pcode);
|
||||
|
||||
// Optional geometry shader
|
||||
shader.gsid = 0;
|
||||
if (!gcode.empty())
|
||||
shader.gsid = CompileSingleShader(GL_GEOMETRY_SHADER, gcode);
|
||||
|
||||
if (!shader.vsid || !shader.psid || (!gcode.empty() && !shader.gsid))
|
||||
{
|
||||
shader.Destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Create and link the program.
|
||||
shader.glprogid = glCreateProgram();
|
||||
|
||||
glAttachShader(shader.glprogid, shader.vsid);
|
||||
glAttachShader(shader.glprogid, shader.psid);
|
||||
if (shader.gsid)
|
||||
glAttachShader(shader.glprogid, shader.gsid);
|
||||
|
||||
if (g_ActiveConfig.backend_info.bSupportsPipelineCacheData)
|
||||
glProgramParameteri(shader.glprogid, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
|
||||
|
||||
shader.SetProgramBindings(false);
|
||||
|
||||
glLinkProgram(shader.glprogid);
|
||||
|
||||
if (!CheckProgramLinkResult(shader.glprogid, vcode, pcode, gcode))
|
||||
{
|
||||
// Don't try to use this shader
|
||||
shader.Destroy();
|
||||
return false;
|
||||
}
|
||||
|
||||
// For drivers that don't support binding layout, we need to bind it here.
|
||||
shader.SetProgramVariables();
|
||||
|
||||
// Original shaders aren't needed any more.
|
||||
shader.DestroyShaders();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ProgramShaderCache::CompileComputeShader(SHADER& shader, const std::string& code)
|
||||
{
|
||||
// We need to enable GL_ARB_compute_shader for drivers that support the extension,
|
||||
@@ -358,7 +291,7 @@ bool ProgramShaderCache::CompileComputeShader(SHADER& shader, const std::string&
|
||||
// original shaders aren't needed any more
|
||||
glDeleteShader(shader_id);
|
||||
|
||||
if (!CheckProgramLinkResult(shader.glprogid, full_code, "", ""))
|
||||
if (!CheckProgramLinkResult(shader.glprogid, &full_code, nullptr, nullptr))
|
||||
{
|
||||
shader.Destroy();
|
||||
return false;
|
||||
@@ -441,8 +374,8 @@ bool ProgramShaderCache::CheckShaderCompileResult(GLuint id, GLenum type, const
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ProgramShaderCache::CheckProgramLinkResult(GLuint id, const std::string& vcode,
|
||||
const std::string& pcode, const std::string& gcode)
|
||||
bool ProgramShaderCache::CheckProgramLinkResult(GLuint id, const std::string* vcode,
|
||||
const std::string* pcode, const std::string* gcode)
|
||||
{
|
||||
GLint linkStatus;
|
||||
glGetProgramiv(id, GL_LINK_STATUS, &linkStatus);
|
||||
@@ -460,9 +393,13 @@ bool ProgramShaderCache::CheckProgramLinkResult(GLuint id, const std::string& vc
|
||||
StringFromFormat("%sbad_p_%d.txt", File::GetUserPath(D_DUMP_IDX).c_str(), num_failures++);
|
||||
std::ofstream file;
|
||||
File::OpenFStream(file, filename, std::ios_base::out);
|
||||
file << s_glsl_header << vcode << s_glsl_header << pcode;
|
||||
if (!gcode.empty())
|
||||
file << s_glsl_header << gcode;
|
||||
if (vcode)
|
||||
file << s_glsl_header << *vcode << '\n';
|
||||
if (gcode)
|
||||
file << s_glsl_header << *gcode << '\n';
|
||||
if (pcode)
|
||||
file << s_glsl_header << *pcode << '\n';
|
||||
|
||||
file << info_log;
|
||||
file.close();
|
||||
|
||||
@@ -557,6 +494,12 @@ void ProgramShaderCache::InvalidateVertexFormat()
|
||||
s_last_VAO = 0;
|
||||
}
|
||||
|
||||
void ProgramShaderCache::InvalidateVertexFormatIfBound(GLuint vao)
|
||||
{
|
||||
if (s_last_VAO == vao)
|
||||
s_last_VAO = 0;
|
||||
}
|
||||
|
||||
void ProgramShaderCache::InvalidateLastProgram()
|
||||
{
|
||||
CurrentProgram = 0;
|
||||
@@ -640,7 +583,10 @@ PipelineProgram* ProgramShaderCache::GetPipelineProgram(const GLVertexFormat* ve
|
||||
if (!s_is_shared_context && vao != s_last_VAO)
|
||||
glBindVertexArray(s_last_VAO);
|
||||
|
||||
if (!ProgramShaderCache::CheckProgramLinkResult(prog->shader.glprogid, {}, {}, {}))
|
||||
if (!ProgramShaderCache::CheckProgramLinkResult(
|
||||
prog->shader.glprogid, vertex_shader ? &vertex_shader->GetSource() : nullptr,
|
||||
geometry_shader ? &geometry_shader->GetSource() : nullptr,
|
||||
pixel_shader ? &pixel_shader->GetSource() : nullptr))
|
||||
{
|
||||
prog->shader.Destroy();
|
||||
return nullptr;
|
||||
@@ -906,6 +852,18 @@ bool SharedContextAsyncShaderCompiler::WorkerThreadInitWorkerThread(void* param)
|
||||
return false;
|
||||
|
||||
s_is_shared_context = true;
|
||||
|
||||
// Make the state match the main context to have a better chance of avoiding recompiles.
|
||||
if (!context->IsGLES())
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
if (g_ActiveConfig.backend_info.bSupportsClipControl)
|
||||
glClipControl(GL_LOWER_LEFT, GL_ZERO_TO_ONE);
|
||||
if (g_ActiveConfig.backend_info.bSupportsDepthClamp)
|
||||
{
|
||||
glEnable(GL_CLIP_DISTANCE0);
|
||||
glEnable(GL_CLIP_DISTANCE1);
|
||||
glEnable(GL_DEPTH_CLAMP);
|
||||
}
|
||||
if (g_ActiveConfig.backend_info.bSupportsPrimitiveRestart)
|
||||
GLUtil::EnablePrimitiveRestart(context);
|
||||
|
||||
|
||||
@@ -72,15 +72,14 @@ public:
|
||||
static void BindVertexFormat(const GLVertexFormat* vertex_format);
|
||||
static bool IsValidVertexFormatBound();
|
||||
static void InvalidateVertexFormat();
|
||||
static void InvalidateVertexFormatIfBound(GLuint vao);
|
||||
static void InvalidateLastProgram();
|
||||
|
||||
static bool CompileShader(SHADER& shader, const std::string& vcode, const std::string& pcode,
|
||||
const std::string& gcode = "");
|
||||
static bool CompileComputeShader(SHADER& shader, const std::string& code);
|
||||
static GLuint CompileSingleShader(GLenum type, const std::string& code);
|
||||
static bool CheckShaderCompileResult(GLuint id, GLenum type, const std::string& code);
|
||||
static bool CheckProgramLinkResult(GLuint id, const std::string& vcode, const std::string& pcode,
|
||||
const std::string& gcode);
|
||||
static bool CheckProgramLinkResult(GLuint id, const std::string* vcode, const std::string* pcode,
|
||||
const std::string* gcode);
|
||||
static StreamBuffer* GetUniformBuffer();
|
||||
static u32 GetUniformBufferAlignment();
|
||||
static void UploadConstants();
|
||||
|
||||
@@ -652,6 +652,10 @@ Renderer::Renderer(std::unique_ptr<GLContext> main_gl_context, float backbuffer_
|
||||
|
||||
// Desktop OpenGL can't have the Android Extension Pack
|
||||
g_ogl_config.bSupportsAEP = false;
|
||||
|
||||
// Desktop GL requires GL_PROGRAM_POINT_SIZE set to use gl_PointSize in shaders.
|
||||
// It is implicitly enabled in GLES.
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
}
|
||||
|
||||
// Either method can do early-z tests. See PixelShaderGen for details.
|
||||
@@ -932,8 +936,8 @@ void Renderer::DispatchComputeShader(const AbstractShader* shader, u32 groups_x,
|
||||
glMemoryBarrier(GL_TEXTURE_UPDATE_BARRIER_BIT);
|
||||
}
|
||||
|
||||
void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,
|
||||
u32 color, u32 z)
|
||||
void Renderer::ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z)
|
||||
{
|
||||
g_framebuffer_manager->FlushEFBPokes();
|
||||
g_framebuffer_manager->FlagPeekCacheAsOutOfDate();
|
||||
@@ -974,7 +978,7 @@ void Renderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaE
|
||||
BPFunctions::SetScissor();
|
||||
}
|
||||
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc)
|
||||
void Renderer::RenderXFBToScreen(const AbstractTexture* texture, const MathUtil::Rectangle<int>& rc)
|
||||
{
|
||||
// Quad-buffered stereo is annoying on GL.
|
||||
if (g_ActiveConfig.stereo_mode != StereoMode::QuadBuffer)
|
||||
@@ -1108,8 +1112,6 @@ void Renderer::CheckForSurfaceResize()
|
||||
void Renderer::BeginUtilityDrawing()
|
||||
{
|
||||
::Renderer::BeginUtilityDrawing();
|
||||
|
||||
glEnable(GL_PROGRAM_POINT_SIZE);
|
||||
if (g_ActiveConfig.backend_info.bSupportsDepthClamp)
|
||||
{
|
||||
glDisable(GL_CLIP_DISTANCE0);
|
||||
@@ -1120,8 +1122,6 @@ void Renderer::BeginUtilityDrawing()
|
||||
void Renderer::EndUtilityDrawing()
|
||||
{
|
||||
::Renderer::EndUtilityDrawing();
|
||||
|
||||
glDisable(GL_PROGRAM_POINT_SIZE);
|
||||
if (g_ActiveConfig.backend_info.bSupportsDepthClamp)
|
||||
{
|
||||
glEnable(GL_CLIP_DISTANCE0);
|
||||
|
||||
@@ -134,11 +134,12 @@ public:
|
||||
|
||||
void Flush() override;
|
||||
void WaitForGPUIdle() override;
|
||||
void RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc) override;
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
void OnConfigChanged(u32 bits) override;
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,
|
||||
u32 color, u32 z) override;
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z) override;
|
||||
|
||||
std::unique_ptr<VideoCommon::AsyncShaderCompiler> CreateAsyncShaderCompiler() override;
|
||||
|
||||
|
||||
@@ -549,8 +549,8 @@ u8* GetPixelPointer(u16 x, u16 y, bool depth)
|
||||
return &efb[GetColorOffset(x, y)];
|
||||
}
|
||||
|
||||
void EncodeXFB(u8* xfb_in_ram, u32 memory_stride, const EFBRectangle& source_rect, float y_scale,
|
||||
float gamma)
|
||||
void EncodeXFB(u8* xfb_in_ram, u32 memory_stride, const MathUtil::Rectangle<int>& source_rect,
|
||||
float y_scale, float gamma)
|
||||
{
|
||||
if (!xfb_in_ram)
|
||||
{
|
||||
@@ -628,8 +628,9 @@ void EncodeXFB(u8* xfb_in_ram, u32 memory_stride, const EFBRectangle& source_rec
|
||||
src_ptr += memory_stride;
|
||||
}
|
||||
|
||||
auto dest_rect = EFBRectangle{source_rect.left, source_rect.top, source_rect.right,
|
||||
static_cast<int>(static_cast<float>(source_rect.bottom) * y_scale)};
|
||||
auto dest_rect =
|
||||
MathUtil::Rectangle<int>{source_rect.left, source_rect.top, source_rect.right,
|
||||
static_cast<int>(static_cast<float>(source_rect.bottom) * y_scale)};
|
||||
|
||||
const std::size_t destination_size = dest_rect.GetWidth() * dest_rect.GetHeight() * 2;
|
||||
static std::vector<yuv422_packed> destination;
|
||||
|
||||
@@ -54,8 +54,8 @@ u32 GetDepth(u16 x, u16 y);
|
||||
|
||||
u8* GetPixelPointer(u16 x, u16 y, bool depth);
|
||||
|
||||
void EncodeXFB(u8* xfb_in_ram, u32 memory_stride, const EFBRectangle& source_rect, float y_scale,
|
||||
float gamma);
|
||||
void EncodeXFB(u8* xfb_in_ram, u32 memory_stride, const MathUtil::Rectangle<int>& source_rect,
|
||||
float y_scale, float gamma);
|
||||
|
||||
u32 GetPerfQueryResult(PerfQueryType type);
|
||||
void ResetPerfQuery();
|
||||
|
||||
@@ -84,7 +84,8 @@ bool SWOGLWindow::Initialize(const WindowSystemInfo& wsi)
|
||||
return true;
|
||||
}
|
||||
|
||||
void SWOGLWindow::ShowImage(const AbstractTexture* image, const EFBRectangle& xfb_region)
|
||||
void SWOGLWindow::ShowImage(const AbstractTexture* image,
|
||||
const MathUtil::Rectangle<int>& xfb_region)
|
||||
{
|
||||
const SW::SWTexture* sw_image = static_cast<const SW::SWTexture*>(image);
|
||||
m_gl_context->Update(); // just updates the render window position and the backbuffer size
|
||||
|
||||
@@ -25,7 +25,7 @@ public:
|
||||
bool IsHeadless() const;
|
||||
|
||||
// Image to show, will be swapped immediately
|
||||
void ShowImage(const AbstractTexture* image, const EFBRectangle& xfb_region);
|
||||
void ShowImage(const AbstractTexture* image, const MathUtil::Rectangle<int>& xfb_region);
|
||||
|
||||
static std::unique_ptr<SWOGLWindow> Create(const WindowSystemInfo& wsi);
|
||||
|
||||
|
||||
@@ -94,7 +94,8 @@ std::unique_ptr<AbstractPipeline> SWRenderer::CreatePipeline(const AbstractPipel
|
||||
}
|
||||
|
||||
// Called on the GPU thread
|
||||
void SWRenderer::RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& xfb_region)
|
||||
void SWRenderer::RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& xfb_region)
|
||||
{
|
||||
if (!IsHeadless())
|
||||
m_window->ShowImage(texture, xfb_region);
|
||||
@@ -136,7 +137,7 @@ void SWRenderer::BBoxWrite(int index, u16 value)
|
||||
BoundingBox::coords[index] = value;
|
||||
}
|
||||
|
||||
void SWRenderer::ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable,
|
||||
void SWRenderer::ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z)
|
||||
{
|
||||
EfbCopy::ClearEfb();
|
||||
|
||||
@@ -42,10 +42,11 @@ public:
|
||||
u16 BBoxRead(int index) override;
|
||||
void BBoxWrite(int index, u16 value) override;
|
||||
|
||||
void RenderXFBToScreen(const AbstractTexture* texture, const EFBRectangle& rc) override;
|
||||
void RenderXFBToScreen(const AbstractTexture* texture,
|
||||
const MathUtil::Rectangle<int>& rc) override;
|
||||
|
||||
void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable,
|
||||
u32 color, u32 z) override;
|
||||
void ClearScreen(const MathUtil::Rectangle<int>& rc, bool colorEnable, bool alphaEnable,
|
||||
bool zEnable, u32 color, u32 z) override;
|
||||
|
||||
void ReinterpretPixelData(EFBReinterpretType convtype) override {}
|
||||
|
||||
|
||||
@@ -11,16 +11,18 @@ class TextureCache : public TextureCacheBase
|
||||
{
|
||||
protected:
|
||||
void CopyEFB(AbstractStagingTexture* dst, const EFBCopyParams& params, u32 native_width,
|
||||
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride, const EFBRectangle& src_rect,
|
||||
bool scale_by_half, bool linear_filter, float y_scale, float gamma, bool clamp_top,
|
||||
bool clamp_bottom, const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
u32 bytes_per_row, u32 num_blocks_y, u32 memory_stride,
|
||||
const MathUtil::Rectangle<int>& src_rect, bool scale_by_half, bool linear_filter,
|
||||
float y_scale, float gamma, bool clamp_top, bool clamp_bottom,
|
||||
const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
{
|
||||
TextureEncoder::Encode(dst, params, native_width, bytes_per_row, num_blocks_y, memory_stride,
|
||||
src_rect, scale_by_half, y_scale, gamma);
|
||||
}
|
||||
void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy, const EFBRectangle& src_rect,
|
||||
bool scale_by_half, bool linear_filter, EFBCopyFormat dst_format,
|
||||
bool is_intensity, float gamma, bool clamp_top, bool clamp_bottom,
|
||||
void CopyEFBToCacheEntry(TCacheEntry* entry, bool is_depth_copy,
|
||||
const MathUtil::Rectangle<int>& src_rect, bool scale_by_half,
|
||||
bool linear_filter, EFBCopyFormat dst_format, bool is_intensity,
|
||||
float gamma, bool clamp_top, bool clamp_bottom,
|
||||
const EFBCopyFilterCoefficients& filter_coefficients) override
|
||||
{
|
||||
// TODO: If we ever want to "fake" vram textures, we would need to implement this
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user