mirror of
https://github.com/libretro/parallel-gx1.git
synced 2026-11-07 04:26:01 -10:00
With version 2 of the frontend interface, a picture whose draw would be a plain copy is not drawn: the XFB texture itself is named with set_texture and the frontend reads it where it is. That is the case when the XFB fills the whole output from its top-left corner at the same size, with one layer, no stereo, no colour correction and the default resampling; with crop overscan on, a full-height XFB at the internal resolution. Anything else is drawn into the output's targets as before. The immediate context orders the frontend's reads before anything later drawn into the texture, so no sync index is waited on. Fields that repeat the picture keep its XFB copy locked as the one being shown, and fields that blank the screen lock it until another picture replaces it, so the copy the frontend shows again is never written meanwhile. The hook is FrameOutput::PresentTexture, reached through AbstractGfx::PresentTexture: an output that only hands on its own targets returns false and the picture is drawn.
86 lines
3.6 KiB
C++
86 lines
3.6 KiB
C++
// Copyright 2010 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#pragma once
|
|
|
|
#include <d3d11_4.h>
|
|
#include <string_view>
|
|
|
|
#include "VideoBackends/D3D/D3DState.h"
|
|
#include "VideoCommon/AbstractGfx.h"
|
|
|
|
class BoundingBox;
|
|
class FrameOutput;
|
|
|
|
namespace DX11
|
|
{
|
|
class DXTexture;
|
|
class DXFramebuffer;
|
|
|
|
class Gfx final : public ::AbstractGfx
|
|
{
|
|
public:
|
|
Gfx(std::unique_ptr<FrameOutput> output, float backbuffer_scale);
|
|
~Gfx() override;
|
|
|
|
StateCache& GetStateCache() { return m_state_cache; }
|
|
|
|
bool IsHeadless() const override;
|
|
|
|
std::unique_ptr<AbstractTexture> CreateTexture(const TextureConfig& config,
|
|
std::string_view name) override;
|
|
std::unique_ptr<AbstractStagingTexture>
|
|
CreateStagingTexture(StagingTextureType type, const TextureConfig& config) override;
|
|
std::unique_ptr<AbstractShader>
|
|
CreateShaderFromSource(ShaderStage stage, std::string_view source,
|
|
std::string_view name) override;
|
|
std::unique_ptr<AbstractShader> CreateShaderFromBinary(ShaderStage stage, const void* data,
|
|
size_t length,
|
|
std::string_view name) override;
|
|
std::unique_ptr<NativeVertexFormat>
|
|
CreateNativeVertexFormat(const PortableVertexDeclaration& vtx_decl) override;
|
|
std::unique_ptr<AbstractPipeline> CreatePipeline(const AbstractPipelineConfig& config,
|
|
const void* cache_data = nullptr,
|
|
size_t cache_data_length = 0) override;
|
|
std::unique_ptr<AbstractFramebuffer>
|
|
CreateFramebuffer(AbstractTexture* color_attachment, AbstractTexture* depth_attachment,
|
|
std::vector<AbstractTexture*> additional_color_attachments) override;
|
|
|
|
void SetPipeline(const AbstractPipeline* pipeline) override;
|
|
void SetFramebuffer(AbstractFramebuffer* framebuffer) override;
|
|
void SetAndDiscardFramebuffer(AbstractFramebuffer* framebuffer) override;
|
|
void SetAndClearFramebuffer(AbstractFramebuffer* framebuffer, const ClearColor& color_value = {},
|
|
float depth_value = 0.0f) override;
|
|
void SetScissorRect(const MathUtil::Rectangle<int>& rc) override;
|
|
void SetTexture(u32 index, const AbstractTexture* texture) override;
|
|
void SetSamplerState(u32 index, const SamplerState& state) override;
|
|
void SetComputeImageTexture(u32 index, AbstractTexture* texture, bool read, bool write) override;
|
|
void UnbindTexture(const AbstractTexture* texture) override;
|
|
void SetViewport(float x, float y, float width, float height, float near_depth,
|
|
float far_depth) override;
|
|
void Draw(u32 base_vertex, u32 num_vertices) override;
|
|
void DrawIndexed(u32 base_index, u32 num_indices, u32 base_vertex) override;
|
|
void DispatchComputeShader(const AbstractShader* shader, u32 groupsize_x, u32 groupsize_y,
|
|
u32 groupsize_z, u32 groups_x, u32 groups_y, u32 groups_z) override;
|
|
bool BindBackbuffer(const ClearColor& clear_color = {}) override;
|
|
void PresentBackbuffer() override;
|
|
bool PresentTexture(const AbstractTexture* texture, u32 width, u32 height) override;
|
|
|
|
void Flush() override;
|
|
void WaitForGPUIdle() override;
|
|
|
|
SurfaceInfo GetSurfaceInfo() const override;
|
|
|
|
// Binds everything again after the frontend used the context.
|
|
void RestoreContext();
|
|
|
|
private:
|
|
StateCache m_state_cache;
|
|
|
|
D3D11_VIEWPORT m_viewport = {};
|
|
D3D11_RECT m_scissor = {};
|
|
float m_backbuffer_scale;
|
|
std::unique_ptr<FrameOutput> m_output;
|
|
};
|
|
} // namespace DX11
|