/* 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; };