mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 23:55:40 +00:00
HostDisplay: Move some derived class fields to base class
This commit is contained in:
parent
736d85b0f3
commit
687772c4da
|
@ -42,6 +42,8 @@ add_library(core
|
||||||
gte.h
|
gte.h
|
||||||
gte.inl
|
gte.inl
|
||||||
gte_types.h
|
gte_types.h
|
||||||
|
host_display.cpp
|
||||||
|
host_display.h
|
||||||
host_interface.cpp
|
host_interface.cpp
|
||||||
host_interface.h
|
host_interface.h
|
||||||
interrupt_controller.cpp
|
interrupt_controller.cpp
|
||||||
|
|
|
@ -70,6 +70,7 @@
|
||||||
<ClCompile Include="gpu.cpp" />
|
<ClCompile Include="gpu.cpp" />
|
||||||
<ClCompile Include="gpu_hw.cpp" />
|
<ClCompile Include="gpu_hw.cpp" />
|
||||||
<ClCompile Include="gpu_hw_opengl.cpp" />
|
<ClCompile Include="gpu_hw_opengl.cpp" />
|
||||||
|
<ClCompile Include="host_display.cpp" />
|
||||||
<ClCompile Include="host_interface.cpp" />
|
<ClCompile Include="host_interface.cpp" />
|
||||||
<ClCompile Include="interrupt_controller.cpp" />
|
<ClCompile Include="interrupt_controller.cpp" />
|
||||||
<ClCompile Include="mdec.cpp" />
|
<ClCompile Include="mdec.cpp" />
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
<ClCompile Include="sio.cpp" />
|
<ClCompile Include="sio.cpp" />
|
||||||
<ClCompile Include="controller.cpp" />
|
<ClCompile Include="controller.cpp" />
|
||||||
<ClCompile Include="analog_controller.cpp" />
|
<ClCompile Include="analog_controller.cpp" />
|
||||||
|
<ClCompile Include="host_display.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="types.h" />
|
<ClInclude Include="types.h" />
|
||||||
|
|
27
src/core/host_display.cpp
Normal file
27
src/core/host_display.cpp
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#include "host_display.h"
|
||||||
|
|
||||||
|
HostDisplayTexture::~HostDisplayTexture() = default;
|
||||||
|
|
||||||
|
HostDisplay::~HostDisplay() = default;
|
||||||
|
|
||||||
|
std::tuple<int, int, int, int> HostDisplay::CalculateDrawRect(int window_width, int window_height, float display_ratio)
|
||||||
|
{
|
||||||
|
const float window_ratio = float(window_width) / float(window_height);
|
||||||
|
int left, top, width, height;
|
||||||
|
if (window_ratio >= display_ratio)
|
||||||
|
{
|
||||||
|
width = static_cast<int>(float(window_height) * display_ratio);
|
||||||
|
height = static_cast<int>(window_height);
|
||||||
|
left = (window_width - width) / 2;
|
||||||
|
top = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
width = static_cast<int>(window_width);
|
||||||
|
height = static_cast<int>(float(window_width) / display_ratio);
|
||||||
|
left = 0;
|
||||||
|
top = (window_height - height) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::tie(left, top, width, height);
|
||||||
|
}
|
|
@ -7,7 +7,7 @@
|
||||||
class HostDisplayTexture
|
class HostDisplayTexture
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual ~HostDisplayTexture() {}
|
virtual ~HostDisplayTexture();
|
||||||
|
|
||||||
virtual void* GetHandle() const = 0;
|
virtual void* GetHandle() const = 0;
|
||||||
virtual u32 GetWidth() const = 0;
|
virtual u32 GetWidth() const = 0;
|
||||||
|
@ -26,7 +26,7 @@ public:
|
||||||
OpenGLES
|
OpenGLES
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual ~HostDisplay() {}
|
virtual ~HostDisplay();
|
||||||
|
|
||||||
virtual RenderAPI GetRenderAPI() const = 0;
|
virtual RenderAPI GetRenderAPI() const = 0;
|
||||||
virtual void* GetRenderDevice() const = 0;
|
virtual void* GetRenderDevice() const = 0;
|
||||||
|
@ -42,11 +42,6 @@ public:
|
||||||
virtual void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
virtual void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
||||||
u32 data_stride) = 0;
|
u32 data_stride) = 0;
|
||||||
|
|
||||||
virtual void SetDisplayTexture(void* texture_handle, s32 offset_x, s32 offset_y, s32 width, s32 height,
|
|
||||||
u32 texture_width, u32 texture_height, float aspect_ratio) = 0;
|
|
||||||
virtual void SetDisplayLinearFiltering(bool enabled) = 0;
|
|
||||||
virtual void SetDisplayTopMargin(int height) = 0;
|
|
||||||
|
|
||||||
virtual void Render() = 0;
|
virtual void Render() = 0;
|
||||||
|
|
||||||
virtual void SetVSync(bool enabled) = 0;
|
virtual void SetVSync(bool enabled) = 0;
|
||||||
|
@ -54,26 +49,39 @@ public:
|
||||||
virtual std::tuple<u32, u32> GetWindowSize() const = 0;
|
virtual std::tuple<u32, u32> GetWindowSize() const = 0;
|
||||||
virtual void WindowResized() = 0;
|
virtual void WindowResized() = 0;
|
||||||
|
|
||||||
// Helper function for computing the draw rectangle in a larger window.
|
const s32 GetDisplayTopMargin() const { return m_display_top_margin; }
|
||||||
static std::tuple<int, int, int, int> CalculateDrawRect(int window_width, int window_height, float display_ratio)
|
|
||||||
|
void SetDisplayTexture(void* texture_handle, s32 offset_x, s32 offset_y, s32 width, s32 height, u32 texture_width,
|
||||||
|
u32 texture_height, float aspect_ratio)
|
||||||
{
|
{
|
||||||
const float window_ratio = float(window_width) / float(window_height);
|
m_display_texture_handle = texture_handle;
|
||||||
int left, top, width, height;
|
m_display_offset_x = offset_x;
|
||||||
if (window_ratio >= display_ratio)
|
m_display_offset_y = offset_y;
|
||||||
{
|
m_display_width = width;
|
||||||
width = static_cast<int>(float(window_height) * display_ratio);
|
m_display_height = height;
|
||||||
height = static_cast<int>(window_height);
|
m_display_texture_width = texture_width;
|
||||||
left = (window_width - width) / 2;
|
m_display_texture_height = texture_height;
|
||||||
top = 0;
|
m_display_aspect_ratio = aspect_ratio;
|
||||||
}
|
m_display_texture_changed = true;
|
||||||
else
|
|
||||||
{
|
|
||||||
width = static_cast<int>(window_width);
|
|
||||||
height = static_cast<int>(float(window_width) / display_ratio);
|
|
||||||
left = 0;
|
|
||||||
top = (window_height - height) / 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::tie(left, top, width, height);
|
void SetDisplayLinearFiltering(bool enabled) { m_display_linear_filtering = enabled; }
|
||||||
}
|
void SetDisplayTopMargin(s32 height) { m_display_top_margin = height; }
|
||||||
|
|
||||||
|
// Helper function for computing the draw rectangle in a larger window.
|
||||||
|
static std::tuple<int, int, int, int> CalculateDrawRect(int window_width, int window_height, float display_ratio);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void* m_display_texture_handle = nullptr;
|
||||||
|
s32 m_display_offset_x = 0;
|
||||||
|
s32 m_display_offset_y = 0;
|
||||||
|
s32 m_display_width = 0;
|
||||||
|
s32 m_display_height = 0;
|
||||||
|
u32 m_display_texture_width = 0;
|
||||||
|
u32 m_display_texture_height = 0;
|
||||||
|
s32 m_display_top_margin = 0;
|
||||||
|
float m_display_aspect_ratio = 1.0f;
|
||||||
|
|
||||||
|
bool m_display_texture_changed = false;
|
||||||
|
bool m_display_linear_filtering = false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -138,30 +138,6 @@ void D3D11DisplayWindow::UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D11DisplayWindow::SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height,
|
|
||||||
u32 texture_width, u32 texture_height, float aspect_ratio)
|
|
||||||
{
|
|
||||||
m_display_srv = static_cast<ID3D11ShaderResourceView*>(texture);
|
|
||||||
m_display_offset_x = offset_x;
|
|
||||||
m_display_offset_y = offset_y;
|
|
||||||
m_display_width = width;
|
|
||||||
m_display_height = height;
|
|
||||||
m_display_texture_width = texture_width;
|
|
||||||
m_display_texture_height = texture_height;
|
|
||||||
m_display_aspect_ratio = aspect_ratio;
|
|
||||||
m_display_texture_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11DisplayWindow::SetDisplayLinearFiltering(bool enabled)
|
|
||||||
{
|
|
||||||
m_display_linear_filtering = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11DisplayWindow::SetDisplayTopMargin(int height)
|
|
||||||
{
|
|
||||||
m_display_top_margin = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11DisplayWindow::SetVSync(bool enabled)
|
void D3D11DisplayWindow::SetVSync(bool enabled)
|
||||||
{
|
{
|
||||||
m_vsync = enabled;
|
m_vsync = enabled;
|
||||||
|
@ -452,7 +428,7 @@ void D3D11DisplayWindow::Render()
|
||||||
|
|
||||||
void D3D11DisplayWindow::renderDisplay()
|
void D3D11DisplayWindow::renderDisplay()
|
||||||
{
|
{
|
||||||
if (!m_display_srv)
|
if (!m_display_texture_handle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// - 20 for main menu padding
|
// - 20 for main menu padding
|
||||||
|
@ -463,7 +439,7 @@ void D3D11DisplayWindow::renderDisplay()
|
||||||
m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
m_context->VSSetShader(m_display_vertex_shader.Get(), nullptr, 0);
|
m_context->VSSetShader(m_display_vertex_shader.Get(), nullptr, 0);
|
||||||
m_context->PSSetShader(m_display_pixel_shader.Get(), nullptr, 0);
|
m_context->PSSetShader(m_display_pixel_shader.Get(), nullptr, 0);
|
||||||
m_context->PSSetShaderResources(0, 1, &m_display_srv);
|
m_context->PSSetShaderResources(0, 1, reinterpret_cast<ID3D11ShaderResourceView**>(&m_display_texture_handle));
|
||||||
m_context->PSSetSamplers(
|
m_context->PSSetSamplers(
|
||||||
0, 1, m_display_linear_filtering ? m_linear_sampler.GetAddressOf() : m_point_sampler.GetAddressOf());
|
0, 1, m_display_linear_filtering ? m_linear_sampler.GetAddressOf() : m_point_sampler.GetAddressOf());
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,6 @@ public:
|
||||||
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
||||||
u32 data_stride) override;
|
u32 data_stride) override;
|
||||||
|
|
||||||
void SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height, u32 texture_width,
|
|
||||||
u32 texture_height, float aspect_ratio) override;
|
|
||||||
void SetDisplayLinearFiltering(bool enabled) override;
|
|
||||||
void SetDisplayTopMargin(int height) override;
|
|
||||||
|
|
||||||
void SetVSync(bool enabled) override;
|
void SetVSync(bool enabled) override;
|
||||||
|
|
||||||
std::tuple<u32, u32> GetWindowSize() const override;
|
std::tuple<u32, u32> GetWindowSize() const override;
|
||||||
|
@ -79,18 +74,6 @@ private:
|
||||||
D3D11::Texture m_display_pixels_texture;
|
D3D11::Texture m_display_pixels_texture;
|
||||||
D3D11::StreamBuffer m_display_uniform_buffer;
|
D3D11::StreamBuffer m_display_uniform_buffer;
|
||||||
|
|
||||||
ID3D11ShaderResourceView* m_display_srv = nullptr;
|
|
||||||
s32 m_display_offset_x = 0;
|
|
||||||
s32 m_display_offset_y = 0;
|
|
||||||
s32 m_display_width = 0;
|
|
||||||
s32 m_display_height = 0;
|
|
||||||
u32 m_display_texture_width = 0;
|
|
||||||
u32 m_display_texture_height = 0;
|
|
||||||
int m_display_top_margin = 0;
|
|
||||||
float m_display_aspect_ratio = 1.0f;
|
|
||||||
|
|
||||||
bool m_display_texture_changed = false;
|
|
||||||
bool m_display_linear_filtering = false;
|
|
||||||
bool m_allow_tearing_supported = false;
|
bool m_allow_tearing_supported = false;
|
||||||
bool m_vsync = false;
|
bool m_vsync = false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -155,30 +155,6 @@ void OpenGLDisplayWindow::UpdateTexture(HostDisplayTexture* texture, u32 x, u32
|
||||||
glBindTexture(GL_TEXTURE_2D, old_texture_binding);
|
glBindTexture(GL_TEXTURE_2D, old_texture_binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLDisplayWindow::SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height,
|
|
||||||
u32 texture_width, u32 texture_height, float aspect_ratio)
|
|
||||||
{
|
|
||||||
m_display_texture_id = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
|
|
||||||
m_display_offset_x = offset_x;
|
|
||||||
m_display_offset_y = offset_y;
|
|
||||||
m_display_width = width;
|
|
||||||
m_display_height = height;
|
|
||||||
m_display_texture_width = texture_width;
|
|
||||||
m_display_texture_height = texture_height;
|
|
||||||
m_display_aspect_ratio = aspect_ratio;
|
|
||||||
m_display_texture_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLDisplayWindow::SetDisplayLinearFiltering(bool enabled)
|
|
||||||
{
|
|
||||||
m_display_linear_filtering = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLDisplayWindow::SetDisplayTopMargin(int height)
|
|
||||||
{
|
|
||||||
m_display_top_margin = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLDisplayWindow::SetVSync(bool enabled)
|
void OpenGLDisplayWindow::SetVSync(bool enabled)
|
||||||
{
|
{
|
||||||
// Window framebuffer has to be bound to call SetSwapInterval.
|
// Window framebuffer has to be bound to call SetSwapInterval.
|
||||||
|
@ -473,7 +449,7 @@ void OpenGLDisplayWindow::Render()
|
||||||
|
|
||||||
void OpenGLDisplayWindow::renderDisplay()
|
void OpenGLDisplayWindow::renderDisplay()
|
||||||
{
|
{
|
||||||
if (!m_display_texture_id)
|
if (!m_display_texture_handle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// - 20 for main menu padding
|
// - 20 for main menu padding
|
||||||
|
@ -491,7 +467,7 @@ void OpenGLDisplayWindow::renderDisplay()
|
||||||
static_cast<float>(m_display_offset_y) / static_cast<float>(m_display_texture_height),
|
static_cast<float>(m_display_offset_y) / static_cast<float>(m_display_texture_height),
|
||||||
static_cast<float>(m_display_width) / static_cast<float>(m_display_texture_width),
|
static_cast<float>(m_display_width) / static_cast<float>(m_display_texture_width),
|
||||||
static_cast<float>(m_display_height) / static_cast<float>(m_display_texture_height));
|
static_cast<float>(m_display_height) / static_cast<float>(m_display_texture_height));
|
||||||
glBindTexture(GL_TEXTURE_2D, m_display_texture_id);
|
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(reinterpret_cast<uintptr_t>(m_display_texture_handle)));
|
||||||
glBindSampler(0, m_display_linear_filtering ? m_display_linear_sampler : m_display_nearest_sampler);
|
glBindSampler(0, m_display_linear_filtering ? m_display_linear_sampler : m_display_nearest_sampler);
|
||||||
glBindVertexArray(m_display_vao);
|
glBindVertexArray(m_display_vao);
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
|
@ -36,11 +36,6 @@ public:
|
||||||
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
||||||
u32 data_stride) override;
|
u32 data_stride) override;
|
||||||
|
|
||||||
void SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height, u32 texture_width,
|
|
||||||
u32 texture_height, float aspect_ratio) override;
|
|
||||||
void SetDisplayLinearFiltering(bool enabled) override;
|
|
||||||
void SetDisplayTopMargin(int height) override;
|
|
||||||
|
|
||||||
void SetVSync(bool enabled) override;
|
void SetVSync(bool enabled) override;
|
||||||
|
|
||||||
std::tuple<u32, u32> GetWindowSize() const override;
|
std::tuple<u32, u32> GetWindowSize() const override;
|
||||||
|
@ -63,19 +58,8 @@ private:
|
||||||
|
|
||||||
GL::Program m_display_program;
|
GL::Program m_display_program;
|
||||||
GLuint m_display_vao = 0;
|
GLuint m_display_vao = 0;
|
||||||
GLuint m_display_texture_id = 0;
|
|
||||||
s32 m_display_offset_x = 0;
|
|
||||||
s32 m_display_offset_y = 0;
|
|
||||||
s32 m_display_width = 0;
|
|
||||||
s32 m_display_height = 0;
|
|
||||||
u32 m_display_texture_width = 0;
|
|
||||||
u32 m_display_texture_height = 0;
|
|
||||||
int m_display_top_margin = 0;
|
|
||||||
float m_display_aspect_ratio = 1.0f;
|
|
||||||
GLuint m_display_nearest_sampler = 0;
|
GLuint m_display_nearest_sampler = 0;
|
||||||
GLuint m_display_linear_sampler = 0;
|
GLuint m_display_linear_sampler = 0;
|
||||||
|
|
||||||
bool m_is_gles = false;
|
bool m_is_gles = false;
|
||||||
bool m_display_texture_changed = false;
|
|
||||||
bool m_display_linear_filtering = false;
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,8 +22,6 @@ public:
|
||||||
virtual bool initializeDeviceContext(bool debug_device);
|
virtual bool initializeDeviceContext(bool debug_device);
|
||||||
virtual void destroyDeviceContext();
|
virtual void destroyDeviceContext();
|
||||||
|
|
||||||
virtual void SetDisplayLinearFiltering(bool enabled) = 0;
|
|
||||||
virtual void SetDisplayTopMargin(int height) = 0;
|
|
||||||
virtual void Render() = 0;
|
virtual void Render() = 0;
|
||||||
|
|
||||||
// this comes back on the emu thread
|
// this comes back on the emu thread
|
||||||
|
|
|
@ -143,7 +143,7 @@ void QtHostInterface::applySettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_settings.display_linear_filtering != old_display_linear_filtering)
|
if (m_settings.display_linear_filtering != old_display_linear_filtering)
|
||||||
m_display_window->SetDisplayLinearFiltering(m_settings.display_linear_filtering);
|
m_display_window->getHostDisplayInterface()->SetDisplayLinearFiltering(m_settings.display_linear_filtering);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtHostInterface::checkSettings()
|
void QtHostInterface::checkSettings()
|
||||||
|
|
|
@ -142,30 +142,6 @@ void D3D11HostDisplay::UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3D11HostDisplay::SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height,
|
|
||||||
u32 texture_width, u32 texture_height, float aspect_ratio)
|
|
||||||
{
|
|
||||||
m_display_srv = static_cast<ID3D11ShaderResourceView*>(texture);
|
|
||||||
m_display_offset_x = offset_x;
|
|
||||||
m_display_offset_y = offset_y;
|
|
||||||
m_display_width = width;
|
|
||||||
m_display_height = height;
|
|
||||||
m_display_texture_width = texture_width;
|
|
||||||
m_display_texture_height = texture_height;
|
|
||||||
m_display_aspect_ratio = aspect_ratio;
|
|
||||||
m_display_texture_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11HostDisplay::SetDisplayLinearFiltering(bool enabled)
|
|
||||||
{
|
|
||||||
m_display_linear_filtering = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11HostDisplay::SetDisplayTopMargin(int height)
|
|
||||||
{
|
|
||||||
m_display_top_margin = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void D3D11HostDisplay::SetVSync(bool enabled)
|
void D3D11HostDisplay::SetVSync(bool enabled)
|
||||||
{
|
{
|
||||||
m_vsync = enabled;
|
m_vsync = enabled;
|
||||||
|
@ -418,7 +394,7 @@ void D3D11HostDisplay::Render()
|
||||||
|
|
||||||
void D3D11HostDisplay::RenderDisplay()
|
void D3D11HostDisplay::RenderDisplay()
|
||||||
{
|
{
|
||||||
if (!m_display_srv)
|
if (!m_display_texture_handle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// - 20 for main menu padding
|
// - 20 for main menu padding
|
||||||
|
@ -429,7 +405,7 @@ void D3D11HostDisplay::RenderDisplay()
|
||||||
m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
m_context->VSSetShader(m_display_vertex_shader.Get(), nullptr, 0);
|
m_context->VSSetShader(m_display_vertex_shader.Get(), nullptr, 0);
|
||||||
m_context->PSSetShader(m_display_pixel_shader.Get(), nullptr, 0);
|
m_context->PSSetShader(m_display_pixel_shader.Get(), nullptr, 0);
|
||||||
m_context->PSSetShaderResources(0, 1, &m_display_srv);
|
m_context->PSSetShaderResources(0, 1, reinterpret_cast<ID3D11ShaderResourceView**>(&m_display_texture_handle));
|
||||||
m_context->PSSetSamplers(
|
m_context->PSSetSamplers(
|
||||||
0, 1, m_display_linear_filtering ? m_linear_sampler.GetAddressOf() : m_point_sampler.GetAddressOf());
|
0, 1, m_display_linear_filtering ? m_linear_sampler.GetAddressOf() : m_point_sampler.GetAddressOf());
|
||||||
|
|
||||||
|
|
|
@ -31,11 +31,6 @@ public:
|
||||||
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
||||||
u32 data_stride) override;
|
u32 data_stride) override;
|
||||||
|
|
||||||
void SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height, u32 texture_width,
|
|
||||||
u32 texture_height, float aspect_ratio) override;
|
|
||||||
void SetDisplayLinearFiltering(bool enabled) override;
|
|
||||||
void SetDisplayTopMargin(int height) override;
|
|
||||||
|
|
||||||
void SetVSync(bool enabled) override;
|
void SetVSync(bool enabled) override;
|
||||||
|
|
||||||
std::tuple<u32, u32> GetWindowSize() const override;
|
std::tuple<u32, u32> GetWindowSize() const override;
|
||||||
|
@ -73,18 +68,6 @@ private:
|
||||||
D3D11::Texture m_display_pixels_texture;
|
D3D11::Texture m_display_pixels_texture;
|
||||||
D3D11::StreamBuffer m_display_uniform_buffer;
|
D3D11::StreamBuffer m_display_uniform_buffer;
|
||||||
|
|
||||||
ID3D11ShaderResourceView* m_display_srv = nullptr;
|
|
||||||
s32 m_display_offset_x = 0;
|
|
||||||
s32 m_display_offset_y = 0;
|
|
||||||
s32 m_display_width = 0;
|
|
||||||
s32 m_display_height = 0;
|
|
||||||
u32 m_display_texture_width = 0;
|
|
||||||
u32 m_display_texture_height = 0;
|
|
||||||
int m_display_top_margin = 0;
|
|
||||||
float m_display_aspect_ratio = 1.0f;
|
|
||||||
|
|
||||||
bool m_display_texture_changed = false;
|
|
||||||
bool m_display_linear_filtering = false;
|
|
||||||
bool m_allow_tearing_supported = false;
|
bool m_allow_tearing_supported = false;
|
||||||
bool m_vsync = false;
|
bool m_vsync = false;
|
||||||
};
|
};
|
||||||
|
|
|
@ -121,30 +121,6 @@ void OpenGLHostDisplay::UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y,
|
||||||
glBindTexture(GL_TEXTURE_2D, old_texture_binding);
|
glBindTexture(GL_TEXTURE_2D, old_texture_binding);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenGLHostDisplay::SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height,
|
|
||||||
u32 texture_width, u32 texture_height, float aspect_ratio)
|
|
||||||
{
|
|
||||||
m_display_texture_id = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
|
|
||||||
m_display_offset_x = offset_x;
|
|
||||||
m_display_offset_y = offset_y;
|
|
||||||
m_display_width = width;
|
|
||||||
m_display_height = height;
|
|
||||||
m_display_texture_width = texture_width;
|
|
||||||
m_display_texture_height = texture_height;
|
|
||||||
m_display_aspect_ratio = aspect_ratio;
|
|
||||||
m_display_texture_changed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLHostDisplay::SetDisplayLinearFiltering(bool enabled)
|
|
||||||
{
|
|
||||||
m_display_linear_filtering = enabled;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLHostDisplay::SetDisplayTopMargin(int height)
|
|
||||||
{
|
|
||||||
m_display_top_margin = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenGLHostDisplay::SetVSync(bool enabled)
|
void OpenGLHostDisplay::SetVSync(bool enabled)
|
||||||
{
|
{
|
||||||
// Window framebuffer has to be bound to call SetSwapInterval.
|
// Window framebuffer has to be bound to call SetSwapInterval.
|
||||||
|
@ -376,7 +352,7 @@ void OpenGLHostDisplay::Render()
|
||||||
|
|
||||||
void OpenGLHostDisplay::RenderDisplay()
|
void OpenGLHostDisplay::RenderDisplay()
|
||||||
{
|
{
|
||||||
if (!m_display_texture_id)
|
if (!m_display_texture_handle)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// - 20 for main menu padding
|
// - 20 for main menu padding
|
||||||
|
@ -394,7 +370,7 @@ void OpenGLHostDisplay::RenderDisplay()
|
||||||
static_cast<float>(m_display_offset_y) / static_cast<float>(m_display_texture_height),
|
static_cast<float>(m_display_offset_y) / static_cast<float>(m_display_texture_height),
|
||||||
static_cast<float>(m_display_width) / static_cast<float>(m_display_texture_width),
|
static_cast<float>(m_display_width) / static_cast<float>(m_display_texture_width),
|
||||||
static_cast<float>(m_display_height) / static_cast<float>(m_display_texture_height));
|
static_cast<float>(m_display_height) / static_cast<float>(m_display_texture_height));
|
||||||
glBindTexture(GL_TEXTURE_2D, m_display_texture_id);
|
glBindTexture(GL_TEXTURE_2D, static_cast<GLuint>(reinterpret_cast<uintptr_t>(m_display_texture_handle)));
|
||||||
glBindSampler(0, m_display_linear_filtering ? m_display_linear_sampler : m_display_nearest_sampler);
|
glBindSampler(0, m_display_linear_filtering ? m_display_linear_sampler : m_display_nearest_sampler);
|
||||||
glBindVertexArray(m_display_vao);
|
glBindVertexArray(m_display_vao);
|
||||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||||
|
|
|
@ -26,11 +26,6 @@ public:
|
||||||
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
void UpdateTexture(HostDisplayTexture* texture, u32 x, u32 y, u32 width, u32 height, const void* data,
|
||||||
u32 data_stride) override;
|
u32 data_stride) override;
|
||||||
|
|
||||||
void SetDisplayTexture(void* texture, s32 offset_x, s32 offset_y, s32 width, s32 height, u32 texture_width,
|
|
||||||
u32 texture_height, float aspect_ratio) override;
|
|
||||||
void SetDisplayLinearFiltering(bool enabled) override;
|
|
||||||
void SetDisplayTopMargin(int height) override;
|
|
||||||
|
|
||||||
void SetVSync(bool enabled) override;
|
void SetVSync(bool enabled) override;
|
||||||
|
|
||||||
std::tuple<u32, u32> GetWindowSize() const override;
|
std::tuple<u32, u32> GetWindowSize() const override;
|
||||||
|
@ -54,19 +49,8 @@ private:
|
||||||
|
|
||||||
GL::Program m_display_program;
|
GL::Program m_display_program;
|
||||||
GLuint m_display_vao = 0;
|
GLuint m_display_vao = 0;
|
||||||
GLuint m_display_texture_id = 0;
|
|
||||||
s32 m_display_offset_x = 0;
|
|
||||||
s32 m_display_offset_y = 0;
|
|
||||||
s32 m_display_width = 0;
|
|
||||||
s32 m_display_height = 0;
|
|
||||||
u32 m_display_texture_width = 0;
|
|
||||||
u32 m_display_texture_height = 0;
|
|
||||||
int m_display_top_margin = 0;
|
|
||||||
float m_display_aspect_ratio = 1.0f;
|
|
||||||
GLuint m_display_nearest_sampler = 0;
|
GLuint m_display_nearest_sampler = 0;
|
||||||
GLuint m_display_linear_sampler = 0;
|
GLuint m_display_linear_sampler = 0;
|
||||||
|
|
||||||
bool m_is_gles = false;
|
bool m_is_gles = false;
|
||||||
bool m_display_texture_changed = false;
|
|
||||||
bool m_display_linear_filtering = false;
|
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue