New upstream version 24.0.3+dfsg1

This commit is contained in:
Sebastian Ramacher 2019-10-13 21:58:08 +02:00
parent 5a730d6ec3
commit 52fa83f147
16 changed files with 213 additions and 32 deletions

View file

@ -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)

View 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@

View file

@ -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++;

View file

@ -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;