CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/libretro/LibretroD3D11Context.cpp
Views: 1401
#include "Common/Log.h"1#include "Core/Config.h"2#include "Core/ConfigValues.h"3#include "libretro/LibretroD3D11Context.h"4#include "Common/GPU/D3D11/D3D11Loader.h"56#include <d3d11_1.h>78#ifdef __MINGW32__9#undef __uuidof10#define __uuidof(type) IID_##type11#endif1213bool LibretroD3D11Context::Init() {14if (!LibretroHWRenderContext::Init(true))15return false;1617g_Config.iGPUBackend = (int)GPUBackend::DIRECT3D11;18return true;19}2021void LibretroD3D11Context::CreateDrawContext() {22std::vector<std::string> adapterNames;2324if (!Libretro::environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&d3d11_) || !d3d11_) {25ERROR_LOG(Log::G3D, "Failed to get HW rendering interface!\n");26return;27}2829if (d3d11_->interface_version != RETRO_HW_RENDER_INTERFACE_D3D11_VERSION) {30ERROR_LOG(Log::G3D, "HW render interface mismatch, expected %u, got %u!\n", RETRO_HW_RENDER_INTERFACE_D3D11_VERSION, d3d11_->interface_version);31return;32}3334// Reject lower feature levels. We have D3D9 for these ancient GPUs.35if (d3d11_->featureLevel < D3D_FEATURE_LEVEL_10_0) {36ERROR_LOG(Log::G3D, "D3D11 featureLevel not high enough - rejecting!\n");37return;38}3940ptr_D3DCompile = d3d11_->D3DCompile;4142ID3D11Device1 *device1 = nullptr;43d3d11_->device->QueryInterface(__uuidof(ID3D11Device1), (void **)&device1);4445ID3D11DeviceContext1 *context1 = nullptr;46d3d11_->context->QueryInterface(__uuidof(ID3D11DeviceContext1), (void **)&context1);4748draw_ = Draw::T3DCreateD3D11Context(d3d11_->device, d3d11_->context, device1, context1, nullptr, d3d11_->featureLevel, NULL, adapterNames, 3);49}5051void LibretroD3D11Context::DestroyDrawContext() {52LibretroHWRenderContext::DestroyDrawContext();53d3d11_ = nullptr;54}5556void LibretroD3D11Context::GotBackbuffer() {57D3D11_TEXTURE2D_DESC desc{};58desc.Width = PSP_CoreParameter().pixelWidth;59desc.Height = PSP_CoreParameter().pixelHeight;60desc.MipLevels = 1;61desc.ArraySize = 1;62desc.Format = format_;63desc.SampleDesc.Count = 1;64desc.SampleDesc.Quality = 0;65desc.Usage = D3D11_USAGE_DEFAULT;66desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;67desc.CPUAccessFlags = 0;68desc.MiscFlags = 0;6970if (SUCCEEDED(d3d11_->device->CreateTexture2D(&desc, nullptr, &texture_))) {71if (SUCCEEDED(d3d11_->device->CreateRenderTargetView(texture_, nullptr, &RTView_))) {72if (SUCCEEDED(d3d11_->device->CreateShaderResourceView(texture_, nullptr, &SRView_))) {73draw_->HandleEvent(Draw::Event::GOT_BACKBUFFER, PSP_CoreParameter().pixelWidth, PSP_CoreParameter().pixelHeight, RTView_, texture_);74return;75}76RTView_->Release();77RTView_ = nullptr;78}79texture_->Release();80texture_ = nullptr;81}82}8384void LibretroD3D11Context::LostBackbuffer() {85LibretroGraphicsContext::LostBackbuffer();86SRView_->Release();87SRView_ = nullptr;88RTView_->Release();89RTView_ = nullptr;90texture_->Release();91texture_ = nullptr;92}9394void LibretroD3D11Context::SwapBuffers() {95ID3D11RenderTargetView *nullView = nullptr;96d3d11_->context->OMSetRenderTargets(1, &nullView, nullptr);9798d3d11_->context->PSSetShaderResources(0, 1, &SRView_);99LibretroHWRenderContext::SwapBuffers();100101ID3D11ShaderResourceView *nullSRV = nullptr;102d3d11_->context->PSSetShaderResources(0, 1, &nullSRV);103104draw_->HandleEvent(Draw::Event::PRESENTED, 0, 0, nullptr, nullptr);105}106107108