CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/libretro/LibretroD3D11Context.cpp
Views: 1401
1
#include "Common/Log.h"
2
#include "Core/Config.h"
3
#include "Core/ConfigValues.h"
4
#include "libretro/LibretroD3D11Context.h"
5
#include "Common/GPU/D3D11/D3D11Loader.h"
6
7
#include <d3d11_1.h>
8
9
#ifdef __MINGW32__
10
#undef __uuidof
11
#define __uuidof(type) IID_##type
12
#endif
13
14
bool LibretroD3D11Context::Init() {
15
if (!LibretroHWRenderContext::Init(true))
16
return false;
17
18
g_Config.iGPUBackend = (int)GPUBackend::DIRECT3D11;
19
return true;
20
}
21
22
void LibretroD3D11Context::CreateDrawContext() {
23
std::vector<std::string> adapterNames;
24
25
if (!Libretro::environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&d3d11_) || !d3d11_) {
26
ERROR_LOG(Log::G3D, "Failed to get HW rendering interface!\n");
27
return;
28
}
29
30
if (d3d11_->interface_version != RETRO_HW_RENDER_INTERFACE_D3D11_VERSION) {
31
ERROR_LOG(Log::G3D, "HW render interface mismatch, expected %u, got %u!\n", RETRO_HW_RENDER_INTERFACE_D3D11_VERSION, d3d11_->interface_version);
32
return;
33
}
34
35
// Reject lower feature levels. We have D3D9 for these ancient GPUs.
36
if (d3d11_->featureLevel < D3D_FEATURE_LEVEL_10_0) {
37
ERROR_LOG(Log::G3D, "D3D11 featureLevel not high enough - rejecting!\n");
38
return;
39
}
40
41
ptr_D3DCompile = d3d11_->D3DCompile;
42
43
ID3D11Device1 *device1 = nullptr;
44
d3d11_->device->QueryInterface(__uuidof(ID3D11Device1), (void **)&device1);
45
46
ID3D11DeviceContext1 *context1 = nullptr;
47
d3d11_->context->QueryInterface(__uuidof(ID3D11DeviceContext1), (void **)&context1);
48
49
draw_ = Draw::T3DCreateD3D11Context(d3d11_->device, d3d11_->context, device1, context1, nullptr, d3d11_->featureLevel, NULL, adapterNames, 3);
50
}
51
52
void LibretroD3D11Context::DestroyDrawContext() {
53
LibretroHWRenderContext::DestroyDrawContext();
54
d3d11_ = nullptr;
55
}
56
57
void LibretroD3D11Context::GotBackbuffer() {
58
D3D11_TEXTURE2D_DESC desc{};
59
desc.Width = PSP_CoreParameter().pixelWidth;
60
desc.Height = PSP_CoreParameter().pixelHeight;
61
desc.MipLevels = 1;
62
desc.ArraySize = 1;
63
desc.Format = format_;
64
desc.SampleDesc.Count = 1;
65
desc.SampleDesc.Quality = 0;
66
desc.Usage = D3D11_USAGE_DEFAULT;
67
desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
68
desc.CPUAccessFlags = 0;
69
desc.MiscFlags = 0;
70
71
if (SUCCEEDED(d3d11_->device->CreateTexture2D(&desc, nullptr, &texture_))) {
72
if (SUCCEEDED(d3d11_->device->CreateRenderTargetView(texture_, nullptr, &RTView_))) {
73
if (SUCCEEDED(d3d11_->device->CreateShaderResourceView(texture_, nullptr, &SRView_))) {
74
draw_->HandleEvent(Draw::Event::GOT_BACKBUFFER, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, RTView_, texture_);
75
return;
76
}
77
RTView_->Release();
78
RTView_ = nullptr;
79
}
80
texture_->Release();
81
texture_ = nullptr;
82
}
83
}
84
85
void LibretroD3D11Context::LostBackbuffer() {
86
LibretroGraphicsContext::LostBackbuffer();
87
SRView_->Release();
88
SRView_ = nullptr;
89
RTView_->Release();
90
RTView_ = nullptr;
91
texture_->Release();
92
texture_ = nullptr;
93
}
94
95
void LibretroD3D11Context::SwapBuffers() {
96
ID3D11RenderTargetView *nullView = nullptr;
97
d3d11_->context->OMSetRenderTargets(1, &nullView, nullptr);
98
99
d3d11_->context->PSSetShaderResources(0, 1, &SRView_);
100
LibretroHWRenderContext::SwapBuffers();
101
102
ID3D11ShaderResourceView *nullSRV = nullptr;
103
d3d11_->context->PSSetShaderResources(0, 1, &nullSRV);
104
105
draw_->HandleEvent(Draw::Event::PRESENTED, 0, 0, nullptr, nullptr);
106
}
107
108