From 93a0e12fdb3d9d49d4b209f470fe9f6c130a56f8 Mon Sep 17 00:00:00 2001 From: Souryo Date: Mon, 23 Jun 2014 16:38:01 -0400 Subject: [PATCH] FPS counter, higher resolution overlay --- 6502_functional_test.bin | Bin 65536 -> 0 bytes Core/Console.cpp | 9 ++- Core/Console.h | 2 + GUI/Calibri.30.spritefont | Bin 0 -> 51208 bytes GUI/GUI.vcxproj | 14 +++-- GUI/GUI.vcxproj.filters | 11 +--- GUI/Renderer.cpp | 121 +++++++++++++++++++++++++------------- GUI/Renderer.h | 20 ++++--- 8 files changed, 116 insertions(+), 61 deletions(-) delete mode 100644 6502_functional_test.bin create mode 100644 GUI/Calibri.30.spritefont diff --git a/6502_functional_test.bin b/6502_functional_test.bin deleted file mode 100644 index 8a20227a6decf69bcdf87155cace7278caa2996a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 Hf9U>yF)>V1 diff --git a/Core/Console.cpp b/Core/Console.cpp index a070611e..09851905 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -3,6 +3,7 @@ #include "Timer.h" uint32_t Console::Flags = 0; +uint32_t Console::CurrentFPS = 0; Console::Console(wstring filename) { @@ -53,6 +54,11 @@ bool Console::CheckFlag(int flag) return (Console::Flags & flag) == flag; } +uint32_t Console::GetFPS() +{ + return Console::CurrentFPS; +} + void Console::Run() { Timer clockTimer; @@ -78,8 +84,9 @@ void Console::Run() if(fpsTimer.GetElapsedMS() > 1000) { uint32_t frameCount = _ppu->GetFrameCount(); - std::cout << ((frameCount - lastFrameCount) / (fpsTimer.GetElapsedMS() / 1000)) << std::endl; + Console::CurrentFPS = (int)((frameCount - lastFrameCount) / (fpsTimer.GetElapsedMS() / 1000)); lastFrameCount = frameCount; + //std::cout << Console::CurrentFPS << std::endl; fpsTimer.Reset(); } diff --git a/Core/Console.h b/Core/Console.h index c54993ac..783873ba 100644 --- a/Core/Console.h +++ b/Core/Console.h @@ -17,6 +17,7 @@ class Console { private: static uint32_t Flags; + static uint32_t CurrentFPS; unique_ptr _cpu; unique_ptr _ppu; @@ -43,4 +44,5 @@ class Console static bool CheckFlag(int flag); static void SetFlags(int flags); static void ClearFlags(int flags); + static uint32_t GetFPS(); }; diff --git a/GUI/Calibri.30.spritefont b/GUI/Calibri.30.spritefont new file mode 100644 index 0000000000000000000000000000000000000000..49f7b4a12fc791555766dee2e401c13fbbd2b864 GIT binary patch literal 51208 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 literal 0 HcmV?d00001 diff --git a/GUI/GUI.vcxproj b/GUI/GUI.vcxproj index 1707b33c..6afba0ef 100644 --- a/GUI/GUI.vcxproj +++ b/GUI/GUI.vcxproj @@ -138,7 +138,9 @@ - + + false + @@ -147,13 +149,15 @@ + + true + - - true - true - + + Always + diff --git a/GUI/GUI.vcxproj.filters b/GUI/GUI.vcxproj.filters index 564165ef..256caa1c 100644 --- a/GUI/GUI.vcxproj.filters +++ b/GUI/GUI.vcxproj.filters @@ -16,9 +16,6 @@ {e3fb11e9-60dd-47df-8444-72d62eb07828} - - {ac76b5fc-ef73-414c-a9c5-a67ea8c3ed57} - @@ -131,10 +128,8 @@ Header Files\DirectXTK - - - - Shaders - + + Resource Files + \ No newline at end of file diff --git a/GUI/Renderer.cpp b/GUI/Renderer.cpp index 8fffb8b5..69daf8d9 100644 --- a/GUI/Renderer.cpp +++ b/GUI/Renderer.cpp @@ -1,7 +1,7 @@ #include "stdafx.h" #include "Renderer.h" -#include "DirectXTK\SpriteBatch.h" #include "..\Core\PPU.h" +#include "..\Core\Console.h" namespace NES { @@ -10,7 +10,7 @@ namespace NES _hInst = hInstance; _hWnd = hWnd; - + if(FAILED(InitDevice())) { CleanupDevice(); return false; @@ -56,8 +56,8 @@ namespace NES DXGI_SWAP_CHAIN_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.BufferCount = 1; - sd.BufferDesc.Width = width; - sd.BufferDesc.Height = height; + sd.BufferDesc.Width = width*4; + sd.BufferDesc.Height = height*4; sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; @@ -110,8 +110,8 @@ namespace NES // Setup the viewport UINT fred; D3D11_VIEWPORT vp; - vp.Width = (FLOAT)width; - vp.Height = (FLOAT)height; + vp.Width = (FLOAT)width*4; + vp.Height = (FLOAT)height*4; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; @@ -138,11 +138,6 @@ namespace NES desc.Height = screenheight; desc.MiscFlags = 0; - D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDescription; - ZeroMemory(&renderTargetViewDescription, sizeof(renderTargetViewDescription)); - renderTargetViewDescription.Format = desc.Format; - renderTargetViewDescription.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; // MS; - _videoRAM = new uint8_t[screenwidth*screenheight * 4]; _nextFrameBuffer = new uint8_t[screenwidth*screenheight * 4]; memset(_videoRAM, 0x00, screenwidth*screenheight*4); @@ -157,8 +152,52 @@ namespace NES return 0; } + _overlayBuffer = new uint8_t[screenwidth*screenheight*4*4*4]; //High res overlay for UI elements (4x res) + memset(_overlayBuffer, 0x00, screenwidth*screenheight*4*4*4); + + ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC)); + desc.ArraySize = 1; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.MipLevels = 1; + desc.MiscFlags = 0; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = fred; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.Width = screenwidth * 4; + desc.Height = screenheight * 4; + desc.MiscFlags = 0; + + tbsd.pSysMem = (void *)_overlayBuffer; + tbsd.SysMemPitch = screenwidth * 4 * 4; + tbsd.SysMemSlicePitch = screenwidth*screenheight * 4 * 4; + + if(FAILED(_pd3dDevice->CreateTexture2D(&desc, &tbsd, &_overlayTexture))) { + return 0; + } + //////////////////////////////////////////////////////////////////////////// _sprites.reset(new SpriteBatch(_pImmediateContext)); + _overlaySpriteBatch.reset(new SpriteBatch(_pImmediateContext)); + + _font.reset(new SpriteFont(_pd3dDevice, L"Calibri.30.spritefont")); + + //Sample state + D3D11_SAMPLER_DESC samplerDesc; + ZeroMemory(&desc, sizeof(desc)); + samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; + samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; + //samplerDesc.BorderColor = { 1.0f, 1.0f, 1.0f, 1.0f }; + samplerDesc.MinLOD = -FLT_MAX; + samplerDesc.MaxLOD = FLT_MAX; + samplerDesc.MipLODBias = 0.0f; + samplerDesc.MaxAnisotropy = 1; + samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + + _pd3dDevice->CreateSamplerState(&samplerDesc, &_samplerState); return S_OK; } @@ -171,26 +210,17 @@ namespace NES { if(_pImmediateContext) _pImmediateContext->ClearState(); - if(_pVertexBuffer) _pVertexBuffer->Release(); - if(_pVertexLayout) _pVertexLayout->Release(); - if(_pVertexShader) _pVertexShader->Release(); - if(_pPixelShader) _pPixelShader->Release(); if(_pRenderTargetView) _pRenderTargetView->Release(); + if(_samplerState) _samplerState->Release(); + if(_pSwapChain) _pSwapChain->Release(); if(_pImmediateContext1) _pImmediateContext1->Release(); - if(_pImmediateContext) _pImmediateContext->Release(); if(_pd3dDevice1) _pd3dDevice1->Release(); if(_pd3dDevice) _pd3dDevice->Release(); } - //-------------------------------------------------------------------------------------- - // Render a frame - //-------------------------------------------------------------------------------------- - void Renderer::Render() + ID3D11ShaderResourceView* Renderer::GetDisplayBufferShaderResourceView() { - // Clear the back buffer - //_pImmediateContext->ClearRenderTargetView(_pRenderTargetView, Colors::MidnightBlue); - UINT screenwidth = 256, screenheight = 240; D3D11_MAPPED_SUBRESOURCE dd; @@ -201,7 +231,7 @@ namespace NES _pImmediateContext->Map(_pTexture, 0, D3D11_MAP_WRITE_DISCARD, 0, &dd); memcpy(dd.pData, _nextFrameBuffer, screenwidth*screenheight * 4); _pImmediateContext->Unmap(_pTexture, 0); - + /////////////////////////////////////////////////////////////////////////////// D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; D3D11_TEXTURE2D_DESC desc; @@ -213,28 +243,39 @@ namespace NES srvDesc.Texture2D.MipLevels = desc.MipLevels; srvDesc.Texture2D.MostDetailedMip = desc.MipLevels - 1; - ID3D11ShaderResourceView *pSRView = NULL; + ID3D11ShaderResourceView *pSRView = nullptr; _pd3dDevice->CreateShaderResourceView(_pTexture, &srvDesc, &pSRView); - /* - D3D11_RENDER_TARGET_VIEW_DESC rtDesc; - rtDesc.Format = desc.Format; - rtDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - rtDesc.Texture2D.MipSlice = 0;*/ + return pSRView; + } - //////////////////////////////////////////////////////////////////////////// + //-------------------------------------------------------------------------------------- + // Render a frame + //-------------------------------------------------------------------------------------- + void Renderer::Render() + { + // Clear the back buffer + _pImmediateContext->ClearRenderTargetView(_pRenderTargetView, Colors::Black); - _sprites->Begin(); - RECT x; - x.left = 0; - x.right = 256; - x.bottom = 240; - x.top = 0; - _sprites->Draw(pSRView, x); - _sprites->End(); + ID3D11ShaderResourceView *shaderResourceView = GetDisplayBufferShaderResourceView(); - pSRView->Release(); + RECT sourceRect; + sourceRect.left = 0; + sourceRect.right = 256; + sourceRect.bottom = 240; + sourceRect.top = 0; + XMVECTOR position{ { 0, 0 } }; + + _overlaySpriteBatch->Begin(SpriteSortMode_Deferred, nullptr, _samplerState); + _overlaySpriteBatch->Draw(shaderResourceView, position, &sourceRect, Colors::White, 0.0f, position, 4.0f); + + _font->DrawString(_overlaySpriteBatch.get(), (wstring(L"FPS: ") + std::to_wstring(Console::GetFPS())).c_str(), XMFLOAT2(256*4-150,11), Colors::Yellow, 0.0f, XMFLOAT2(0,0), 1.0f); + + _overlaySpriteBatch->End(); + + shaderResourceView->Release(); + // Present the information rendered to the back buffer to the front buffer (the screen) _pSwapChain->Present(0, 0); } diff --git a/GUI/Renderer.h b/GUI/Renderer.h index 35c3001a..fee04e2e 100644 --- a/GUI/Renderer.h +++ b/GUI/Renderer.h @@ -1,5 +1,6 @@ #include "stdafx.h" #include "DirectXTK\SpriteBatch.h" +#include "DirectXTK\SpriteFont.h" #include "../Core/IVideoDevice.h" using namespace DirectX; @@ -24,22 +25,27 @@ namespace NES { ID3D11DeviceContext1* _pImmediateContext1 = nullptr; IDXGISwapChain* _pSwapChain = nullptr; ID3D11RenderTargetView* _pRenderTargetView = nullptr; - ID3D11VertexShader* _pVertexShader = nullptr; - ID3D11PixelShader* _pPixelShader = nullptr; - ID3D11InputLayout* _pVertexLayout = nullptr; - ID3D11Buffer* _pVertexBuffer = nullptr; - ID3D11Texture2D* _pTexture = nullptr; + ID3D11SamplerState* _samplerState = nullptr; + + ID3D11Texture2D* _pTexture = nullptr; byte* _videoRAM; uint8_t* _nextFrameBuffer; + unique_ptr _font; + ID3D11Texture2D* _overlayTexture = nullptr; + byte* _overlayBuffer; + std::unique_ptr _overlaySpriteBatch; + std::unique_ptr _sprites; - HRESULT Renderer::InitDevice(); - void Renderer::CleanupDevice(); + HRESULT InitDevice(); + void CleanupDevice(); + ID3D11ShaderResourceView* GetDisplayBufferShaderResourceView(); public: bool Initialize(HINSTANCE hInst, HWND hWnd); + void Render(); void UpdateFrame(uint8_t* frameBuffer)