New upstream version 24.0.3+dfsg1
This commit is contained in:
parent
5a730d6ec3
commit
52fa83f147
16 changed files with 213 additions and 32 deletions
|
|
@ -4,6 +4,20 @@ include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
|
|||
|
||||
add_definitions(-DLIBOBS_EXPORTS)
|
||||
|
||||
if(NOT DEFINED GPU_PRIORITY_VAL OR "${GPU_PRIORITY_VAL}" STREQUAL "" OR
|
||||
"${GPU_PRIORITY_VAL}" STREQUAL "0")
|
||||
set(USE_GPU_PRIORITY FALSE)
|
||||
set(GPU_PRIORITY_VAL "0")
|
||||
else()
|
||||
set(USE_GPU_PRIORITY TRUE)
|
||||
endif()
|
||||
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/d3d11-config.h.in"
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/d3d11-config.h")
|
||||
|
||||
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
||||
|
||||
set(libobs-d3d11_SOURCES
|
||||
d3d11-indexbuffer.cpp
|
||||
d3d11-samplerstate.cpp
|
||||
|
|
@ -18,6 +32,7 @@ set(libobs-d3d11_SOURCES
|
|||
d3d11-zstencilbuffer.cpp)
|
||||
|
||||
set(libobs-d3d11_HEADERS
|
||||
${CMAKE_CURRENT_BINARY_DIR}/d3d11-config.h
|
||||
d3d11-shaderprocessor.hpp
|
||||
d3d11-subsystem.hpp)
|
||||
|
||||
|
|
|
|||
20
libobs-d3d11/d3d11-config.h.in
Normal file
20
libobs-d3d11/d3d11-config.h.in
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
|
||||
#ifndef ON
|
||||
#define ON 1
|
||||
#endif
|
||||
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
|
||||
#ifndef OFF
|
||||
#define OFF 0
|
||||
#endif
|
||||
|
||||
#define USE_GPU_PRIORITY @USE_GPU_PRIORITY@
|
||||
#define GPU_PRIORITY_VAL @GPU_PRIORITY_VAL@
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
******************************************************************************/
|
||||
|
||||
#include "d3d11-subsystem.hpp"
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
|
||||
static inline bool get_monitor(gs_device_t *device, int monitor_idx,
|
||||
IDXGIOutput **dxgiOutput)
|
||||
|
|
@ -122,11 +122,11 @@ EXPORT bool device_get_duplicator_monitor_info(gs_device_t *device,
|
|||
return true;
|
||||
}
|
||||
|
||||
static std::map<int, gs_duplicator *> instances;
|
||||
static std::unordered_map<int, gs_duplicator *> instances;
|
||||
|
||||
void reset_duplicators(void)
|
||||
{
|
||||
for (auto &pair : instances) {
|
||||
for (std::pair<const int, gs_duplicator *> &pair : instances) {
|
||||
pair.second->updated = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -136,7 +136,7 @@ EXPORT gs_duplicator_t *device_duplicator_create(gs_device_t *device,
|
|||
{
|
||||
gs_duplicator *duplicator = nullptr;
|
||||
|
||||
auto it = instances.find(monitor_idx);
|
||||
const auto it = instances.find(monitor_idx);
|
||||
if (it != instances.end()) {
|
||||
duplicator = it->second;
|
||||
duplicator->refs++;
|
||||
|
|
|
|||
|
|
@ -21,8 +21,10 @@
|
|||
#include <util/dstr.h>
|
||||
#include <util/util.hpp>
|
||||
#include <graphics/matrix3.h>
|
||||
#include <winternl.h>
|
||||
#include <d3d9.h>
|
||||
#include "d3d11-subsystem.hpp"
|
||||
#include "d3d11-config.h"
|
||||
|
||||
struct UnsupportedHWError : HRError {
|
||||
inline UnsupportedHWError(const char *str, HRESULT hr)
|
||||
|
|
@ -351,6 +353,63 @@ try {
|
|||
return false;
|
||||
}
|
||||
|
||||
#if USE_GPU_PRIORITY
|
||||
static bool set_priority(ID3D11Device *device)
|
||||
{
|
||||
typedef enum _D3DKMT_SCHEDULINGPRIORITYCLASS {
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_IDLE,
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_BELOW_NORMAL,
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_NORMAL,
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_ABOVE_NORMAL,
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_HIGH,
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_REALTIME
|
||||
} D3DKMT_SCHEDULINGPRIORITYCLASS;
|
||||
|
||||
ComQIPtr<IDXGIDevice> dxgiDevice(device);
|
||||
if (!dxgiDevice) {
|
||||
blog(LOG_DEBUG, "%s: Failed to get IDXGIDevice", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
HMODULE gdi32 = GetModuleHandleW(L"GDI32");
|
||||
if (!gdi32) {
|
||||
blog(LOG_DEBUG, "%s: Failed to get GDI32", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
NTSTATUS(WINAPI * d3dkmt_spspc)(HANDLE, D3DKMT_SCHEDULINGPRIORITYCLASS);
|
||||
d3dkmt_spspc = (decltype(d3dkmt_spspc))GetProcAddress(
|
||||
gdi32, "D3DKMTSetProcessSchedulingPriorityClass");
|
||||
if (!d3dkmt_spspc) {
|
||||
blog(LOG_DEBUG, "%s: Failed to get d3dkmt_spspc", __FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
NTSTATUS status = d3dkmt_spspc(GetCurrentProcess(),
|
||||
D3DKMT_SCHEDULINGPRIORITYCLASS_REALTIME);
|
||||
if (status != 0) {
|
||||
blog(LOG_DEBUG, "%s: Failed to set process priority class: %d",
|
||||
__FUNCTION__, (int)status);
|
||||
return false;
|
||||
}
|
||||
|
||||
HRESULT hr = dxgiDevice->SetGPUThreadPriority(GPU_PRIORITY_VAL);
|
||||
if (FAILED(hr)) {
|
||||
blog(LOG_DEBUG, "%s: SetGPUThreadPriority failed",
|
||||
__FUNCTION__);
|
||||
return false;
|
||||
}
|
||||
|
||||
blog(LOG_INFO, "D3D11 GPU priority setup success");
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool is_intel(const wstring &name)
|
||||
{
|
||||
return wstrstri(name.c_str(), L"intel") != nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
void gs_device::InitDevice(uint32_t adapterIdx)
|
||||
{
|
||||
wstring adapterName;
|
||||
|
|
@ -385,11 +444,24 @@ void gs_device::InitDevice(uint32_t adapterIdx)
|
|||
blog(LOG_INFO, "D3D11 loaded successfully, feature level used: %x",
|
||||
(unsigned int)levelUsed);
|
||||
|
||||
/* adjust gpu thread priority */
|
||||
#if USE_GPU_PRIORITY
|
||||
if (!is_intel(adapterName) && !set_priority(device)) {
|
||||
blog(LOG_INFO, "D3D11 GPU priority setup "
|
||||
"failed (not admin?)");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------- */
|
||||
/* check for nv12 texture output support */
|
||||
|
||||
nv12Supported = false;
|
||||
|
||||
/* WARP NV12 support is suspected to be buggy on older Windows */
|
||||
if (desc.VendorId == 0x1414 && desc.DeviceId == 0x8c) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Intel CopyResource is very slow with NV12 */
|
||||
if (desc.VendorId == 0x8086) {
|
||||
return;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue