From 6a9d5569c5e81c843775446b2286222c5edfd411 Mon Sep 17 00:00:00 2001 From: Squall-Leonhart Date: Thu, 29 Jun 2023 19:30:08 +1000 Subject: [PATCH] d3d9ex --- src/wx/drawing.h | 12 +++---- src/wx/panel.cpp | 91 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/src/wx/drawing.h b/src/wx/drawing.h index 5c2618a5..515ee9c0 100644 --- a/src/wx/drawing.h +++ b/src/wx/drawing.h @@ -58,22 +58,22 @@ struct Vertex float u, v; }; -class DXDrawingPanel : public DrawingPanel { +class DXDrawingPanel : public DrawingPanel +{ public: DXDrawingPanel(wxWindow* parent, int _width, int _height); virtual ~DXDrawingPanel(); protected: + void DrawingPanelInit(); void DrawArea(wxWindowDC&); void OnSize(wxSizeEvent& ev); - void DrawingPanelInit(); - private: - IDirect3D9* d3d; - IDirect3DDevice9* d3ddev; - IDirect3DTexture9* texture; + IDirect3D9Ex* d3d; + IDirect3DDevice9Ex* d3ddev; IDirect3DVertexBuffer9* vbuffer; + IDirect3DTexture9* texture; }; #endif diff --git a/src/wx/panel.cpp b/src/wx/panel.cpp index d0de8f89..a5254a84 100644 --- a/src/wx/panel.cpp +++ b/src/wx/panel.cpp @@ -2446,19 +2446,35 @@ void GLDrawingPanel::DrawArea(wxWindowDC& dc) DXDrawingPanel::DXDrawingPanel(wxWindow* parent, int _width, int _height) : DrawingPanel(parent, _width, _height) { - // Create the Direct3D9 object - d3d = Direct3DCreate9(D3D_SDK_VERSION); + // Create the Direct3D9Ex object + IDirect3D9Ex* d3dEx = nullptr; + HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &d3dEx); + if (FAILED(hr)) + { + // Handle error here + } // Set up the presentation parameters D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; - d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.SwapEffect = D3DSWAPEFFECT_FLIPEX; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; + d3dpp.BackBufferCount = 2; + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - // Create the Direct3D9 device - d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetHWND(), - D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); + // Create the Direct3D9Ex device + IDirect3DDevice9Ex* d3ddevEx = nullptr; + hr = d3dEx->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, (HWND)wxGetApp().frame->GetHandle(), + D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, NULL, &d3ddevEx); + if (FAILED(hr)) + { + // Handle error here + } + + // Store the Direct3D9Ex device and object in member variables + d3ddev = d3ddevEx; + d3d = d3dEx; // Call the DrawingPanelInit method to initialize the rendering state and resources DrawingPanelInit(); @@ -2468,12 +2484,23 @@ void DXDrawingPanel::DrawingPanelInit() { // Set up the rendering state bool bilinear = true; // Set the desired texture filtering mode here - d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); - d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); - d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); - d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, bilinear ? D3DTEXF_LINEAR : D3DTEXF_POINT); - d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, bilinear ? D3DTEXF_LINEAR : D3DTEXF_POINT); + + if (d3ddev != nullptr) + { + // The IDirect3DDevice9Ex object has been created and initialized correctly + // You can use it here + d3ddev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + d3ddev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + d3ddev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + d3ddev->SetSamplerState(0, D3DSAMP_MINFILTER, bilinear ? D3DTEXF_LINEAR : D3DTEXF_POINT); + d3ddev->SetSamplerState(0, D3DSAMP_MAGFILTER, bilinear ? D3DTEXF_LINEAR : D3DTEXF_POINT); + } + else + { + // The IDirect3DDevice9Ex object has not been created or initialized correctly + // Handle the error here + } // Define a matrix type struct Matrix4x4 @@ -2492,7 +2519,6 @@ void DXDrawingPanel::DrawingPanelInit() matProj.m[3][3] = 1.0f; d3ddev->SetTransform(D3DTS_PROJECTION, (D3DMATRIX*)&matProj); - // Create the vertex buffer Vertex vertices[] = { { 0.0f, 1.0f, 0.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 0.0f, 1.0f, 1.0f }, @@ -2502,9 +2528,10 @@ void DXDrawingPanel::DrawingPanelInit() d3ddev->CreateVertexBuffer(4 * sizeof(Vertex), D3DUSAGE_WRITEONLY, D3DFVF_XYZ | D3DFVF_TEX1, - D3DPOOL_MANAGED, + D3DPOOL_DEFAULT, &vbuffer, NULL); + void* pVertices; vbuffer->Lock(0, sizeof(vertices), @@ -2520,9 +2547,9 @@ void DXDrawingPanel::DrawingPanelInit() HRESULT hr = d3ddev->CreateTexture(texWidth, texHeight, 1, - 0, + D3DUSAGE_DYNAMIC, texFormat, - D3DPOOL_MANAGED, + D3DPOOL_DEFAULT, &texture, NULL); if (FAILED(hr)) @@ -2542,6 +2569,31 @@ DXDrawingPanel::~DXDrawingPanel() void DXDrawingPanel::DrawArea(wxWindowDC& dc) { + // Check if the device is lost + HRESULT hr = d3ddev->TestCooperativeLevel(); + if (hr == D3DERR_DEVICELOST) + { + // Release any resources created in the D3DPOOL_DEFAULT memory pool + if (vbuffer) vbuffer->Release(); + if (texture) texture->Release(); + + // Reset the device + D3DPRESENT_PARAMETERS d3dpp; + ZeroMemory(&d3dpp, sizeof(d3dpp)); + d3dpp.Windowed = TRUE; + d3dpp.SwapEffect = D3DSWAPEFFECT_FLIPEX; + d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; + d3dpp.BackBufferCount = 2; + hr = d3ddev->ResetEx(&d3dpp, NULL); + if (FAILED(hr)) + { + // Handle error here + } + + // Recreate any resources that were released + DrawingPanelInit(); + } + if (!did_init) { DrawingPanelInit(); } @@ -2593,11 +2645,10 @@ void DXDrawingPanel::OnSize(wxSizeEvent& ev) D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = TRUE; - d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.SwapEffect = D3DSWAPEFFECT_FLIPEX; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; - d3dpp.BackBufferWidth = ev.GetSize().GetWidth(); - d3dpp.BackBufferHeight = ev.GetSize().GetHeight(); - d3ddev->Reset(&d3dpp); + d3dpp.BackBufferCount = 2; + d3ddev->ResetEx(&d3dpp, NULL); // Update the projection matrix float width = (float)ev.GetSize().GetWidth();