/*
Copyright 2021 flyinghead
This file is part of Flycast.
Flycast is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
Flycast is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Flycast. If not, see .
*/
#pragma once
#include "types.h"
#include "hw/pvr/Renderer_if.h"
#include
#include "dx11context.h"
#include "rend/transform_matrix.h"
#include "dx11_quad.h"
#include "dx11_texture.h"
#include "dx11_shaders.h"
#include "rend/sorter.h"
#include "dx11_renderstate.h"
#include "dx11_naomi2.h"
#ifndef LIBRETRO
#include "dx11_driver.h"
#endif
struct DX11Renderer : public Renderer
{
bool Init() override;
void Resize(int w, int h) override;
void Term() override;
bool Process(TA_context* ctx) override;
bool Render() override;
bool Present() override
{
if (!frameRendered)
return false;
frameRendered = false;
#ifndef LIBRETRO
imguiDriver->setFrameRendered();
#endif
return true;
}
bool RenderLastFrame() override;
void DrawOSD(bool clear_screen) override;
BaseTextureCacheData *GetTexture(TSP tsp, TCW tcw) override;
protected:
struct VertexConstants
{
float transMatrix[4][4];
float leftPlane[4];
float topPlane[4];
float rightPlane[4];
float bottomPlane[4];
};
struct PixelConstants
{
float colorClampMin[4];
float colorClampMax[4];
float fog_col_vert[4];
float fog_col_ram[4];
float fogDensity;
float shadowScale;
float alphaTestValue;
};
struct PixelPolyConstants
{
float clipTest[4];
float paletteIndex;
float trilinearAlpha;
};
bool ensureBufferSize(ComPtr& buffer, D3D11_BIND_FLAG bind, u32& currentSize, u32 minSize);
void createDepthTexAndView(ComPtr& texture, ComPtr& view, int width, int height, DXGI_FORMAT format = DXGI_FORMAT_D24_UNORM_S8_UINT, UINT bindFlags = 0);
void createTexAndRenderTarget(ComPtr& texture, ComPtr& renderTarget, int width, int height);
void configVertexShader();
void uploadGeometryBuffers();
void setupPixelShaderConstants();
void updateFogTexture();
void updatePaletteTexture();
void renderDCFramebuffer();
void readRttRenderTarget(u32 texAddress);
void renderFramebuffer();
void setCullMode(int mode);
virtual void setRTTSize(int width, int height) {}
ComPtr device;
ComPtr deviceContext;
ComPtr depthTex;
ComPtr depthTexView;
ComPtr mainInputLayout;
ComPtr modVolInputLayout;
ComPtr pxlPolyConstants;
ComPtr vertexBuffer;
ComPtr indexBuffer;
ComPtr modvolBuffer;
ComPtr fbRenderTarget;
ComPtr rttRenderTarget;
ComPtr fbTextureView;
BlendStates blendStates;
DepthStencilStates depthStencilStates;
Samplers *samplers;
TransformMatrix matrices;
D3D11_RECT scissorRect{};
u32 width = 0;
u32 height = 0;
bool frameRendered = false;
bool frameRenderedOnce = false;
Naomi2Helper n2Helper;
private:
void readDCFramebuffer();
void prepareRttRenderTarget(u32 texAddress);
void setBaseScissor();
void drawStrips();
template
void drawList(const List& gply, int first, int count);
template
void setRenderState(const PolyParam *gp);
void sortTriangles(int first, int count);
void drawSorted(bool multipass);
void drawModVols(int first, int count);
u32 vertexBufferSize = 0;
u32 modvolBufferSize = 0;
u32 indexBufferSize = 0;
ComPtr sortedTriIndexBuffer;
u32 sortedTriIndexBufferSize = 0;
ComPtr fbTex;
ComPtr dcfbTexture;
ComPtr dcfbTextureView;
ComPtr paletteTexture;
ComPtr paletteTextureView;
ComPtr fogTexture;
ComPtr fogTextureView;
ComPtr rttTexture;
ComPtr rttDepthTex;
ComPtr rttDepthTexView;
ComPtr whiteTexture;
ComPtr whiteTextureView;
ComPtr rasterCullNone, rasterCullFront, rasterCullBack;
DX11TextureCache texCache;
DX11Shaders *shaders;
std::vector pidx_sort;
std::unique_ptr quad;
ComPtr vtxConstants;
ComPtr pxlConstants;
bool scissorEnable = false;
};