Skip to content
Snippets Groups Projects

d3d11: fix win7 support

Open Martin Finkel requested to merge mfkl/vlc-unity:win7-support into master
@@ -19,7 +19,9 @@
#include <memory>
#if !defined(UWP)
// #include <comdef.h> // enable for debugging
#ifndef NDEBUG
#include <comdef.h>
#endif
#endif
#define SCREEN_WIDTH 100
@@ -141,6 +143,21 @@ void Report_cb(void *opaque,
me->Report(report_size_change, report_mouse_move, report_mouse_press, report_mouse_release, report_opaque);
}
bool IsWindows7()
{
#if !defined(UWP)
OSVERSIONINFO osvi = {};
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi))
{
// Windows 7 corresponds to version 6.1
return (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1);
}
#endif
return false;
}
RenderAPI* CreateRenderAPI_D3D11()
{
return new RenderAPI_D3D11();
@@ -246,11 +263,16 @@ void ReadWriteTexture::Update(UINT width, UINT height, ID3D11Device *m_d3deviceU
texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
texDesc.Height = height;
texDesc.Width = width;
texDesc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED | D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
texDesc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED;
if (!IsWindows7())
{
texDesc.MiscFlags |= D3D11_RESOURCE_MISC_SHARED_NTHANDLE;
}
HRESULT hr;
hr = m_d3deviceUnity->CreateTexture2D( &texDesc, NULL, &m_textureUnity );
hr = m_d3deviceUnity->CreateTexture2D(&texDesc, NULL, &m_textureUnity);
if (FAILED(hr))
{
DEBUG("CreateTexture2D FAILED \n");
@@ -260,42 +282,79 @@ void ReadWriteTexture::Update(UINT width, UINT height, ID3D11Device *m_d3deviceU
DEBUG("CreateTexture2D SUCCEEDED.\n");
}
IDXGIResource1* sharedResource = NULL;
hr = m_textureUnity->QueryInterface(&sharedResource);
if(FAILED(hr))
if (IsWindows7())
{
DEBUG("get IDXGIResource1 FAILED \n");
}
// For Windows 7, use IDXGIResource to get the shared handle
IDXGIResource* sharedResource = NULL;
hr = m_textureUnity->QueryInterface(__uuidof(IDXGIResource), (void**)&sharedResource);
if (FAILED(hr))
{
DEBUG("QueryInterface for IDXGIResource FAILED \n");
return;
}
hr = sharedResource->CreateSharedHandle(NULL, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, NULL, &m_sharedHandle);
if(FAILED(hr))
{
// _com_error error(hr);
DEBUG("sharedResource->CreateSharedHandle FAILED \n");
hr = sharedResource->GetSharedHandle(&m_sharedHandle);
if (FAILED(hr))
{
// _com_error error(hr);
DEBUG("sharedResource->GetSharedHandle FAILED\n");
// DEBUG("%s", error.ErrorMessage());
}
sharedResource->Release();
}
else
{
// For Windows 8 and later, use IDXGIResource1 to create the shared handle
IDXGIResource1* sharedResource = NULL;
hr = m_textureUnity->QueryInterface(__uuidof(IDXGIResource1), (void**)&sharedResource);
if (FAILED(hr))
{
DEBUG("QueryInterface for IDXGIResource1 FAILED \n");
return;
}
sharedResource->Release();
sharedResource = NULL;
hr = sharedResource->CreateSharedHandle(NULL, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, NULL, &m_sharedHandle);
if (FAILED(hr))
{
// _com_error error(hr);
DEBUG("sharedResource->CreateSharedHandle FAILED\n");
// DEBUG("%s", error.ErrorMessage());
}
sharedResource->Release();
}
ID3D11Device1* d3d11VLC1;
hr = m_d3deviceVLC->QueryInterface(&d3d11VLC1);
if(FAILED(hr))
if (FAILED(hr))
{
// _com_error error(hr);
DEBUG("QueryInterface ID3D11Device1 FAILED \n");
}
ID3D11Texture2D* textureVLC;
hr = d3d11VLC1->OpenSharedResource1(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)&textureVLC);
if(FAILED(hr))
if (IsWindows7())
{
hr = d3d11VLC1->OpenSharedResource(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)&textureVLC);
}
else
{
hr = d3d11VLC1->OpenSharedResource1(m_sharedHandle, __uuidof(ID3D11Texture2D), (void**)&textureVLC);
}
if (FAILED(hr))
{
// _com_error error(hr);
DEBUG("ctx->d3device->OpenSharedResource FAILED \n");
DEBUG("OpenSharedResource FAILED\n");
// DEBUG("%s", error.ErrorMessage());
}
d3d11VLC1->Release();
d3d11VLC1 = NULL;
if (d3d11VLC1)
{
d3d11VLC1->Release();
d3d11VLC1 = NULL;
}
D3D11_SHADER_RESOURCE_VIEW_DESC resviewDesc;
ZeroMemory(&resviewDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC));
@@ -305,7 +364,9 @@ void ReadWriteTexture::Update(UINT width, UINT height, ID3D11Device *m_d3deviceU
hr = m_d3deviceUnity->CreateShaderResourceView(m_textureUnity, &resviewDesc, &m_textureShaderInput);
if (FAILED(hr))
{
DEBUG("CreateShaderResourceView FAILED \n");
// _com_error error(hr);
DEBUG("CreateShaderResourceView FAILED\n");
// DEBUG("%s", error.ErrorMessage());
}
else
{
@@ -320,11 +381,16 @@ void ReadWriteTexture::Update(UINT width, UINT height, ID3D11Device *m_d3deviceU
hr = m_d3deviceVLC->CreateRenderTargetView(textureVLC, &renderTargetViewDesc, &m_textureRenderTarget);
if (FAILED(hr))
{
DEBUG("CreateRenderTargetView FAILED \n");
// _com_error error(hr);
DEBUG("CreateRenderTargetView FAILED\n");
// DEBUG("%s", error.ErrorMessage());
}
textureVLC->Release();// No need to keep a reference to that, VLC only writes to the renderTarget
textureVLC = NULL;
if (textureVLC)
{
textureVLC->Release(); // No need to keep a reference to that, VLC only writes to the renderTarget
textureVLC = NULL;
}
}
void RenderAPI_D3D11::CreateResources()
Loading