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 zcmeHOZH!#idA@V*&iL-`?9S}^YYjFmi6Pg>K|>8&wrz8qb*U@XcMKC z`OzwsSa#O&xGT%!7zraA2{9QlWY3C4OB6@Jjl-l1EAJGeL#s33trJK5ks)>J&y$@{r0_Fg%=ad}hL z4U(z*+@LFU#0@ejmI>CRg7vB3id3*E6%3}l(S;mToA()6c7q#Jv*d^yY)|D#)(vh; z?IriQ!LAfd8mj2&LWl7Er#-;v1ir%jDk4gP8 z>Hl={6N$TfQl&kz+m;Ps^{w=9rOwng1^dB1edFAZq4m z6GY93mF1|dEJw{{IU1``&2?EtY=THe{5=(sgGlBz7UmT?&W3q~j^oP8a)gMD2N^&Xr=E=N(_NJvit-*NXj~K57mRlF&v|GFFtn4Y@29IXmAMi%=3!HI(I~>5CJO~G$Fz$a#OU}Z<|1j=~M3WggQmz*FG3^!>`kO+qDj7v_Cz*!0mdl{FsAcRq;8K*rkY7TiWd2q2B&5I>n z^59Z9nipHPvLly`hvVbOJ0iUu+=CoHc$(;7!GOUt0 z?bS>&leT8k_L+oaLKYwnSs-M{0?C9dpb1&Pr_zMZ9MtCxoW9-?d^Y*W&n6{^dr+Ur z!0y$J0|bztWp$!p5#v}S#%cI$#SovPF^)xIOd1CfLwq(dXft1F9`vW|4tYyLU`3IF zNEqq}BPo;BSYEOmix=vl&3w6e%%8Sb!#gbmRxBxq#S%tVtVzpDmSyomEZE{6#%V8X zaRO%bq&JgDK;2(GNK4Ph)2EIE+Ta5{pj{KK`uQ%c?FH@HXwlDiYi$O!>!eoK9F04DQ3N(MM*~k^ z6p>BM(a6&mMQBrVH1zaE5!=*Une#5GwGJz-?DH;l%JV#&YGsFasY}W9C@YS4sawf( zEr!n&VE9bdhR>vG_+)++r<#^?IFO!!r9T6i9(GB!M-JdX&rAo1A=$$nq}nSxf1r0J z31Z0iaFSFrvgHRdGbs>5%7;_pJL_u3=^C~5&xlif%0DEweySGR`e)Y2Q}~eB`l(uM z>z`Sx)MD$WYO$?pZ1ZEWVSeoT)n&Tb^{L z?pSPj)|tA?bKa}*%`flsUX5>ld58CEeDlkW_iB9e4WB8%@R_U)pGnp5$^6RU=I^&Q z|B%`I{nq9mGMm5O+WbRi^Y>eue@Jfr8pi3`@HTg1wYSn;t|9MoZ7lTd2`rqvf69Xk zx_`9w7I#5Xv>IrJ3-adlsW-T_jMH`DL&*!9Ay(UGl7@VkXk(!tB^u%(Aolq1pYmzv zMOnpTId6FG_08fstsZ19NZwWhO?#m&Z6zg%zbi7H0N%($RJ}f#eM=ZM^KFbIxiD%= z5BKhMjMMev-hX0)y7hllxqPZOarFPa^_M@X@b7Lt-kqq|Cu<+i{3FVqIKY6W^7j}NW!Ont5KOnt5KOnt5KOnr3D6E|Y$v3@3``#fBh(+zTyY17}lPJdm7uZ8fMD&cQl ztG^M$iw-4Qqh;SWvejC)EWfQr_-<1&n@_xt6R!>ppLjJRWg(w=ySKHQv?jQyg6(4@H43xy^}i_;`&ahfbGPLrm^330K&?8c-#1b#TIMY<7M0>82Ze#=tjTrT*pnr=+0 zW5Ei?Ewsu&@Ty}$Y#AHoTG)+Ac_?^m&fk;J>ooTPTPv zfc=1TYh1|2g$#m$>`@_$^e5sAQQ@4ieIY!^Y+qFuE%;~Bq&2V*#v==1JhbI*Vq5Me zxaDr5FO0Va2U$Ee$l{@muZe7YO<>~-aVs6r$AbT})vb|17LN?Fcx2;iA{$>5+4!1@ z&%=c$K4>9~M;5|(Xv^Kiw%ko{%N?SZJ1U;6{Ec=Q2w^+}A&h5Wxtk0ucawqTZtDN( z=GO8-7LN_GcxdBmA{$>5*!Y^bueXT{vUpsO#p4=Z6W92fxW*Ua!WC~L<8+h$GICiY96sP!sq&SaX7Gr8aqxxY1XPZ z*GA)9?4@5n4V8!LXq&Crl3c2FudUc$ zTOo55+g96|tJqQ+D0Uv2BRUs5kH22A7M(}b!mdTq=ovNO9J!itI%sBeH0`fTdnZ;pM`CK-6}@Rk)Bab4cXTv*S7K^ii{(AELTqTp z(R4&@$A(UX>gYJE*pfUt3oG{Du8_HkZL96fRcxt_j=+j-t9AdyIWovNy~gzaDVO+H zxx_oQ;yKc4p*x}X3M~FiaYP59ccRroS7dYCx?&#C65xnh*m*!#Y>Vhn>^w9_bS`!t zkFHpY&Le7J*P`>#7SRFOc|->y+v_7y;0qah6v+J4Z=Do zFQywwcD}wStma#+>bb5)g1t>AifMLU(KVxVW9{jh`3Rk~iqOH?{29jSXH}*p7k*pf zzpt(^@nn;fmt4|FvR~BSmzJ-!v8?C18wqxSPLy22egPQ+Z8J`5l8(_f^D$bTxJ?V0 zf0l8&S!I4ybnhc^KH6!YNJEzi<&7jeSEoeU{c9V$dJg_&_$@lY&Oy#c(~yWwDAQ;| z*vv-=wVg!>*=}Z>UaPWwN_LN{EwvLq!w+VdUp_WH$pi2nz-5$_Gvvp1k;lS0{yE621_z4->;YyL3m3h%Qo zs+ZnTz4R9PF!GHt@5$_LbMeQv0b33rS&FXbv^?5#m2ExWd#UI_;;X zK0^FIy({aVr zKgT%r<U*&yNSPcV1=niblOi%eK+wp-Llfuqe|_mroNl_8*W)?>QSZcemM2r z#82G)DN~Q=Tc*C7_qe!E?MjaeX(!8|26oB z)nbOtLy#?u)9XtP`B(%w9)_TaV!D{6jtH}T@ab*y>1u{~^I3Ylm|^`}GAuoxvHu1J zpWe2ZuJ$ai6}le#FX-C_)YabQ+?EU*nC~@zi~Z(rzIU;|3T0JgnTuIgJPS!)&p2H! zIV3o~EpR%#YR_Nxdaq;{AKj98B?~|KtM>aQ?~g7GPY3_#Irk5(?+or8iu(;S-nf@>_%%(d-#3GyV4}t4 zZuL`W9qJSLi^xvKXLw@aOY&D{qtg)hp`bPt%nb$eiezCYTJgH#9%= HPecC)F)>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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 U$!sk2ujfars>NRVD#PRd0SW>#&;S4c 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)