Windows build fixes

This commit is contained in:
Jack Andersen 2019-07-27 15:19:25 -10:00
parent ae5d7e5131
commit af50bc0bc2
9 changed files with 102 additions and 125 deletions

View File

@ -17,6 +17,7 @@ add_subdirectory(xxhash)
option(BOO_GRAPHICS_DEBUG_GROUPS "Enable Debug Groups for labeling graphics passes within backend API." OFF) option(BOO_GRAPHICS_DEBUG_GROUPS "Enable Debug Groups for labeling graphics passes within backend API." OFF)
if (BOO_GRAPHICS_DEBUG_GROUPS) if (BOO_GRAPHICS_DEBUG_GROUPS)
message(STATUS "Enabling graphics debug groups")
list(APPEND _BOO_SYS_DEFINES -DBOO_GRAPHICS_DEBUG_GROUPS=1) list(APPEND _BOO_SYS_DEFINES -DBOO_GRAPHICS_DEBUG_GROUPS=1)
endif() endif()
@ -41,16 +42,19 @@ if(TARGET nx_compiler)
endif() endif()
if(NOT GEKKO AND NOT CAFE AND NOT WINDOWS_STORE AND NOT NX AND NOT APPLE) if(NOT GEKKO AND NOT CAFE AND NOT WINDOWS_STORE AND NOT NX AND NOT APPLE)
list(APPEND PLAT_SRCS add_library(glew lib/graphicsdev/glew.c)
lib/graphicsdev/GL.cpp target_include_directories(glew PUBLIC include/boo/graphicsdev)
lib/graphicsdev/glew.c) target_compile_definitions(glew PUBLIC -DGLEW_NO_GLU=1)
list(APPEND _BOO_SYS_DEFINES -DBOO_HAS_GL=1 -DGLEW_NO_GLU=1)
list(APPEND PLAT_HDRS list(APPEND PLAT_SRCS lib/graphicsdev/GL.cpp)
include/boo/graphicsdev/GLSLMacros.hpp list(APPEND _BOO_SYS_DEFINES -DBOO_HAS_GL=1)
include/boo/graphicsdev/GL.hpp list(APPEND _BOO_SYS_LIBS glew)
include/boo/graphicsdev/Vulkan.hpp
include/boo/graphicsdev/VulkanDispatchTable.hpp) list(APPEND PLAT_HDRS
include/boo/graphicsdev/GLSLMacros.hpp
include/boo/graphicsdev/GL.hpp
include/boo/graphicsdev/Vulkan.hpp
include/boo/graphicsdev/VulkanDispatchTable.hpp)
endif() endif()
if(WINDOWS_STORE) if(WINDOWS_STORE)
@ -173,7 +177,6 @@ else(NOT GEKKO)
lib/x11/WindowWayland.cpp lib/x11/WindowWayland.cpp
lib/graphicsdev/GL.cpp lib/graphicsdev/GL.cpp
lib/graphicsdev/GLX.cpp lib/graphicsdev/GLX.cpp
lib/graphicsdev/glew.c
lib/audiodev/LinuxMidi.hpp) lib/audiodev/LinuxMidi.hpp)
find_package(PkgConfig) find_package(PkgConfig)

View File

@ -117,14 +117,14 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
#if !WINDOWS_STORE #if !WINDOWS_STORE
if (!m_device) { if (!m_device) {
if (FAILED(m_enumerator->GetDevice(MBSTWCS(m_sinkName.c_str()).c_str(), &m_device))) { if (FAILED(m_enumerator->GetDevice(MBSTWCS(m_sinkName.c_str()).c_str(), &m_device))) {
Log.report(logvisor::Error, fmt("unable to obtain audio device %s"), m_sinkName.c_str()); Log.report(logvisor::Error, fmt("unable to obtain audio device %s"), m_sinkName);
m_device.Reset(); m_device.Reset();
return; return;
} }
} }
if (FAILED(m_device->Activate(IID_IAudioClient, CLSCTX_ALL, nullptr, &m_audClient))) { if (FAILED(m_device->Activate(IID_IAudioClient, CLSCTX_ALL, nullptr, &m_audClient))) {
Log.report(logvisor::Error, L"unable to create audio client from device"); Log.report(logvisor::Error, fmt(L"unable to create audio client from device"));
m_device.Reset(); m_device.Reset();
return; return;
} }
@ -132,7 +132,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
WAVEFORMATEXTENSIBLE* pwfx; WAVEFORMATEXTENSIBLE* pwfx;
if (FAILED(m_audClient->GetMixFormat((WAVEFORMATEX**)&pwfx))) { if (FAILED(m_audClient->GetMixFormat((WAVEFORMATEX**)&pwfx))) {
Log.report(logvisor::Error, L"unable to obtain audio mix format from device"); Log.report(logvisor::Error, fmt(L"unable to obtain audio mix format from device"));
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -210,7 +210,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
/* Initialize audio client */ /* Initialize audio client */
if (FAILED(m_audClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 0, 450000, /* 45ms */ if (FAILED(m_audClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 0, 450000, /* 45ms */
0, (WAVEFORMATEX*)pwfx, nullptr))) { 0, (WAVEFORMATEX*)pwfx, nullptr))) {
Log.report(logvisor::Error, L"unable to initialize audio client"); Log.report(logvisor::Error, fmt(L"unable to initialize audio client"));
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -231,7 +231,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
m_mixInfo.m_sampleFormat = SOXR_INT32_I; m_mixInfo.m_sampleFormat = SOXR_INT32_I;
m_mixInfo.m_bitsPerSample = 32; m_mixInfo.m_bitsPerSample = 32;
} else { } else {
Log.report(logvisor::Fatal, L"unsupported bits-per-sample %d", pwfx->Format.wBitsPerSample); Log.report(logvisor::Fatal, fmt(L"unsupported bits-per-sample {}"), pwfx->Format.wBitsPerSample);
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -244,7 +244,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
m_mixInfo.m_sampleFormat = SOXR_FLOAT32_I; m_mixInfo.m_sampleFormat = SOXR_FLOAT32_I;
m_mixInfo.m_bitsPerSample = 32; m_mixInfo.m_bitsPerSample = 32;
} else { } else {
Log.report(logvisor::Error, L"unsupported floating-point bits-per-sample %d", pwfx->Format.wBitsPerSample); Log.report(logvisor::Error, fmt(L"unsupported floating-point bits-per-sample {}"), pwfx->Format.wBitsPerSample);
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -256,7 +256,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
UINT32 bufferFrameCount; UINT32 bufferFrameCount;
if (FAILED(m_audClient->GetBufferSize(&bufferFrameCount))) { if (FAILED(m_audClient->GetBufferSize(&bufferFrameCount))) {
Log.report(logvisor::Error, L"unable to get audio buffer frame count"); Log.report(logvisor::Error, fmt(L"unable to get audio buffer frame count"));
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -265,7 +265,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
m_mixInfo.m_periodFrames = bufferFrameCount; m_mixInfo.m_periodFrames = bufferFrameCount;
if (FAILED(m_audClient->GetService(IID_IAudioRenderClient, &m_renderClient))) { if (FAILED(m_audClient->GetService(IID_IAudioRenderClient, &m_renderClient))) {
Log.report(logvisor::Error, L"unable to create audio render client"); Log.report(logvisor::Error, fmt(L"unable to create audio render client"));
#if !WINDOWS_STORE #if !WINDOWS_STORE
m_device.Reset(); m_device.Reset();
#endif #endif
@ -342,18 +342,18 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
/* Enumerate default audio device */ /* Enumerate default audio device */
if (FAILED( if (FAILED(
CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_ALL, IID_IMMDeviceEnumerator, &m_enumerator))) { CoCreateInstance(CLSID_MMDeviceEnumerator, nullptr, CLSCTX_ALL, IID_IMMDeviceEnumerator, &m_enumerator))) {
Log.report(logvisor::Error, L"unable to create MMDeviceEnumerator instance"); Log.report(logvisor::Error, fmt(L"unable to create MMDeviceEnumerator instance"));
return; return;
} }
if (FAILED(m_enumerator->RegisterEndpointNotificationCallback(&m_notificationClient))) { if (FAILED(m_enumerator->RegisterEndpointNotificationCallback(&m_notificationClient))) {
Log.report(logvisor::Error, L"unable to register multimedia event callback"); Log.report(logvisor::Error, fmt(L"unable to register multimedia event callback"));
m_device.Reset(); m_device.Reset();
return; return;
} }
if (FAILED(m_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_device))) { if (FAILED(m_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &m_device))) {
Log.report(logvisor::Error, L"unable to obtain default audio device"); Log.report(logvisor::Error, fmt(L"unable to obtain default audio device"));
m_device.Reset(); m_device.Reset();
return; return;
} }
@ -381,7 +381,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
m_started = false; m_started = false;
if (m_mixInfo.m_sampleFormat != oldFmt) if (m_mixInfo.m_sampleFormat != oldFmt)
Log.report(logvisor::Fatal, L"audio device sample format changed, boo doesn't support this!!"); Log.report(logvisor::Fatal, fmt(L"audio device sample format changed, boo doesn't support this!!"));
_resetSampleRate(); _resetSampleRate();
} }
@ -398,7 +398,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
int attempt = 0; int attempt = 0;
while (true) { while (true) {
if (attempt >= 10) if (attempt >= 10)
Log.report(logvisor::Fatal, L"unable to setup AudioRenderClient"); Log.report(logvisor::Fatal, fmt(L"unable to setup AudioRenderClient"));
if (m_rebuild) { if (m_rebuild) {
m_device.Reset(); m_device.Reset();
@ -468,7 +468,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
bool setCurrentAudioOutput(const char* name) { bool setCurrentAudioOutput(const char* name) {
ComPtr<IMMDevice> newDevice; ComPtr<IMMDevice> newDevice;
if (FAILED(m_enumerator->GetDevice(MBSTWCS(name).c_str(), &newDevice))) { if (FAILED(m_enumerator->GetDevice(MBSTWCS(name).c_str(), &newDevice))) {
Log.report(logvisor::Error, fmt("unable to obtain audio device %s"), name); Log.report(logvisor::Error, fmt("unable to obtain audio device {}"), name);
return false; return false;
} }
m_device = newDevice; m_device = newDevice;
@ -482,7 +482,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine {
ComPtr<IMMDeviceCollection> collection; ComPtr<IMMDeviceCollection> collection;
if (FAILED(m_enumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &collection))) { if (FAILED(m_enumerator->EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, &collection))) {
Log.report(logvisor::Error, L"unable to enumerate audio outputs"); Log.report(logvisor::Error, fmt(L"unable to enumerate audio outputs"));
return ret; return ret;
} }

View File

@ -18,6 +18,8 @@
#undef max #undef max
extern pD3DCompile D3DCompilePROC; extern pD3DCompile D3DCompilePROC;
extern pD3DPERF_BeginEvent D3DPERF_BeginEventPROC;
extern pD3DPERF_EndEvent D3DPERF_EndEventPROC;
static const char* GammaVS = static const char* GammaVS =
"struct VertData\n" "struct VertData\n"
@ -59,20 +61,6 @@ static const char* GammaFS =
" return colorOut;\n" " return colorOut;\n"
"}\n"; "}\n";
static const char* FlipFS =
"struct VertToFrag\n"
"{\n"
" float4 pos : SV_Position;\n"
" float2 uv : UV;\n"
"};\n"
"\n"
"Texture2D tex : register(t0);\n"
"SamplerState samp : register(s3);\n"
"float4 main(in VertToFrag vtf) : SV_Target0\n"
"{\n"
" return tex.Sample(samp, vtf.uv);\n"
"}\n";
namespace boo { namespace boo {
static logvisor::Module Log("boo::D3D11"); static logvisor::Module Log("boo::D3D11");
class D3D11DataFactory; class D3D11DataFactory;
@ -86,7 +74,7 @@ static inline void ThrowIfFailed(HRESULT hr) {
_com_error err(hr, L"D3D11 fail"); _com_error err(hr, L"D3D11 fail");
#endif #endif
LPCTSTR errMsg = err.ErrorMessage(); LPCTSTR errMsg = err.ErrorMessage();
Log.report(logvisor::Fatal, errMsg); Log.report(logvisor::Fatal, fmt(_SYS_STR("{}")), errMsg);
} }
} }
@ -205,7 +193,7 @@ class D3D11TextureS : public GraphicsDataNode<ITextureS> {
} }
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, upData, &m_tex)); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, upData, &m_tex));
CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(m_tex.Get(), D3D_SRV_DIMENSION_TEXTURE2D, pfmt, 0, mips); CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(D3D_SRV_DIMENSION_TEXTURE2D, pfmt, 0, mips);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_tex.Get(), &srvDesc, &m_srv)); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_tex.Get(), &srvDesc, &m_srv));
} }
@ -261,7 +249,7 @@ class D3D11TextureSA : public GraphicsDataNode<ITextureSA> {
} }
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, upData.get(), &m_tex)); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, upData.get(), &m_tex));
CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(m_tex.Get(), D3D_SRV_DIMENSION_TEXTURE2DARRAY, pixelFmt); CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(D3D_SRV_DIMENSION_TEXTURE2DARRAY, pixelFmt, 0, mips, 0, layers);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_tex.Get(), &srvDesc, &m_srv)); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_tex.Get(), &srvDesc, &m_srv));
} }
@ -307,9 +295,9 @@ class D3D11TextureD : public GraphicsDataNode<ITextureD> {
CD3D11_TEXTURE2D_DESC desc(pixelFmt, width, height, 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DYNAMIC, CD3D11_TEXTURE2D_DESC desc(pixelFmt, width, height, 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DYNAMIC,
D3D11_CPU_ACCESS_WRITE); D3D11_CPU_ACCESS_WRITE);
CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(D3D_SRV_DIMENSION_TEXTURE2D, pixelFmt, 0, 1);
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, nullptr, &m_texs[i])); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&desc, nullptr, &m_texs[i]));
CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(m_texs[i].Get(), D3D_SRV_DIMENSION_TEXTURE2D, pixelFmt);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_texs[i].Get(), &srvDesc, &m_srvs[i])); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_texs[i].Get(), &srvDesc, &m_srvs[i]));
} }
} }
@ -356,25 +344,24 @@ class D3D11TextureR : public GraphicsDataNode<ITextureR> {
dsvDim = D3D11_DSV_DIMENSION_TEXTURE2D; dsvDim = D3D11_DSV_DIMENSION_TEXTURE2D;
} }
CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(m_colorTex.Get(), rtvDim); CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(rtvDim, ctx->m_fbFormat);
ThrowIfFailed(ctx->m_dev->CreateRenderTargetView(m_colorTex.Get(), &rtvDesc, &m_rtv)); ThrowIfFailed(ctx->m_dev->CreateRenderTargetView(m_colorTex.Get(), &rtvDesc, &m_rtv));
CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(m_depthTex.Get(), dsvDim); CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(dsvDim, DXGI_FORMAT_D32_FLOAT);
ThrowIfFailed(ctx->m_dev->CreateDepthStencilView(m_depthTex.Get(), &dsvDesc, &m_dsv)); ThrowIfFailed(ctx->m_dev->CreateDepthStencilView(m_depthTex.Get(), &dsvDesc, &m_dsv));
CD3D11_TEXTURE2D_DESC colorBindDesc(ctx->m_fbFormat, m_width, m_height, 1, 1, D3D11_BIND_SHADER_RESOURCE,
D3D11_USAGE_DEFAULT, 0, 1);
CD3D11_SHADER_RESOURCE_VIEW_DESC colorSrvDesc(D3D11_SRV_DIMENSION_TEXTURE2D, ctx->m_fbFormat, 0, 1);
for (size_t i = 0; i < m_colorBindCount; ++i) { for (size_t i = 0; i < m_colorBindCount; ++i) {
CD3D11_TEXTURE2D_DESC colorBindDesc(ctx->m_fbFormat, m_width, m_height, 1, 1, D3D11_BIND_SHADER_RESOURCE,
D3D11_USAGE_DEFAULT, 0, 1);
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&colorBindDesc, nullptr, &m_colorBindTex[i])); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&colorBindDesc, nullptr, &m_colorBindTex[i]));
CD3D11_SHADER_RESOURCE_VIEW_DESC colorSrvDesc(m_colorBindTex[i].Get(), D3D11_SRV_DIMENSION_TEXTURE2D);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_colorBindTex[i].Get(), &colorSrvDesc, &m_colorSrv[i])); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_colorBindTex[i].Get(), &colorSrvDesc, &m_colorSrv[i]));
} }
CD3D11_TEXTURE2D_DESC depthBindDesc(DXGI_FORMAT_R32_FLOAT, m_width, m_height, 1, 1, D3D11_BIND_SHADER_RESOURCE,
D3D11_USAGE_DEFAULT, 0, 1);
CD3D11_SHADER_RESOURCE_VIEW_DESC depthSrvDesc(D3D11_SRV_DIMENSION_TEXTURE2D, DXGI_FORMAT_R32_FLOAT, 0, 1);
for (size_t i = 0; i < m_depthBindCount; ++i) { for (size_t i = 0; i < m_depthBindCount; ++i) {
CD3D11_TEXTURE2D_DESC depthBindDesc(DXGI_FORMAT_R32_FLOAT, m_width, m_height, 1, 1, D3D11_BIND_SHADER_RESOURCE,
D3D11_USAGE_DEFAULT, 0, 1);
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&depthBindDesc, nullptr, &m_depthBindTex[i])); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&depthBindDesc, nullptr, &m_depthBindTex[i]));
CD3D11_SHADER_RESOURCE_VIEW_DESC depthSrvDesc(m_depthBindTex[i].Get(), D3D11_SRV_DIMENSION_TEXTURE2D,
DXGI_FORMAT_R32_FLOAT);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_depthBindTex[i].Get(), &depthSrvDesc, &m_depthSrv[i])); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_depthBindTex[i].Get(), &depthSrvDesc, &m_depthSrv[i]));
} }
} }
@ -432,37 +419,26 @@ class D3D11TextureCubeR : public GraphicsDataNode<ITextureCubeR> {
size_t m_mipCount = 0; size_t m_mipCount = 0;
void Setup(D3D11Context* ctx) { void Setup(D3D11Context* ctx) {
CD3D11_TEXTURE2D_DESC colorDesc(ctx->m_fbFormat, m_width, m_width, 6, 1, CD3D11_TEXTURE2D_DESC colorDesc(ctx->m_fbFormat, m_width, m_width, 6, m_mipCount,
D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DEFAULT, 0, 1, 0, D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DEFAULT, 0, 1, 0,
D3D11_RESOURCE_MISC_TEXTURECUBE); D3D11_RESOURCE_MISC_TEXTURECUBE | D3D11_RESOURCE_MISC_GENERATE_MIPS);
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&colorDesc, nullptr, &m_colorTex)); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&colorDesc, nullptr, &m_colorTex));
CD3D11_TEXTURE2D_DESC depthDesc(DXGI_FORMAT_D32_FLOAT, m_width, m_width, 6, 1, D3D11_BIND_DEPTH_STENCIL, CD3D11_TEXTURE2D_DESC depthDesc(DXGI_FORMAT_D32_FLOAT, m_width, m_width, 6, 1, D3D11_BIND_DEPTH_STENCIL,
D3D11_USAGE_DEFAULT, 0, 1, 0, D3D11_RESOURCE_MISC_TEXTURECUBE); D3D11_USAGE_DEFAULT, 0, 1, 0, D3D11_RESOURCE_MISC_TEXTURECUBE);
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&depthDesc, nullptr, &m_depthTex)); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&depthDesc, nullptr, &m_depthTex));
D3D11_RTV_DIMENSION rtvDim = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(D3D11_RTV_DIMENSION_TEXTURE2DARRAY, ctx->m_fbFormat, 0, 0, 1);
D3D11_DSV_DIMENSION dsvDim = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(D3D11_DSV_DIMENSION_TEXTURE2DARRAY, DXGI_FORMAT_D32_FLOAT, 0, 0, 1);
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(m_colorTex.Get(), rtvDim, ctx->m_fbFormat, 0, i); rtvDesc.Texture2DArray.FirstArraySlice = i;
ThrowIfFailed(ctx->m_dev->CreateRenderTargetView(m_colorTex.Get(), &rtvDesc, &m_rtv[i])); ThrowIfFailed(ctx->m_dev->CreateRenderTargetView(m_colorTex.Get(), &rtvDesc, &m_rtv[i]));
CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(m_depthTex.Get(), dsvDim, DXGI_FORMAT_D32_FLOAT, 0, i); dsvDesc.Texture2DArray.FirstArraySlice = i;
ThrowIfFailed(ctx->m_dev->CreateDepthStencilView(m_depthTex.Get(), &dsvDesc, &m_dsv[i])); ThrowIfFailed(ctx->m_dev->CreateDepthStencilView(m_depthTex.Get(), &dsvDesc, &m_dsv[i]));
CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(D3D11_SRV_DIMENSION_TEXTURE2DARRAY, ctx->m_fbFormat, 0, 1, i, 1);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_colorTex.Get(), &srvDesc, &m_srv[i]));
} }
CD3D11_TEXTURE2D_DESC colorBindDesc(ctx->m_fbFormat, m_width, m_width, 6, m_mipCount, CD3D11_SHADER_RESOURCE_VIEW_DESC colorSrvDesc(D3D11_SRV_DIMENSION_TEXTURECUBE,
D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DEFAULT, 0,
1, 0, D3D11_RESOURCE_MISC_TEXTURECUBE | D3D11_RESOURCE_MISC_GENERATE_MIPS);
ThrowIfFailed(ctx->m_dev->CreateTexture2D(&colorBindDesc, nullptr, &m_colorBindTex));
for (int i = 0; i < 6; ++i) {
CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(m_colorBindTex.Get(), rtvDim, ctx->m_fbFormat, 0, i);
ThrowIfFailed(ctx->m_dev->CreateRenderTargetView(m_colorBindTex.Get(), &rtvDesc, &m_colorBindRtv[i]));
}
CD3D11_SHADER_RESOURCE_VIEW_DESC colorSrvDesc(m_colorBindTex.Get(), D3D11_SRV_DIMENSION_TEXTURECUBE,
ctx->m_fbFormat, 0, m_mipCount); ctx->m_fbFormat, 0, m_mipCount);
ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_colorBindTex.Get(), &colorSrvDesc, &m_colorSrv)); ThrowIfFailed(ctx->m_dev->CreateShaderResourceView(m_colorTex.Get(), &colorSrvDesc, &m_colorSrv));
} }
D3D11TextureCubeR(const boo::ObjToken<BaseGraphicsData>& parent, D3D11Context* ctx, size_t width, size_t mips) D3D11TextureCubeR(const boo::ObjToken<BaseGraphicsData>& parent, D3D11Context* ctx, size_t width, size_t mips)
@ -473,13 +449,10 @@ class D3D11TextureCubeR : public GraphicsDataNode<ITextureCubeR> {
public: public:
ComPtr<ID3D11Texture2D> m_colorTex; ComPtr<ID3D11Texture2D> m_colorTex;
ComPtr<ID3D11RenderTargetView> m_rtv[6]; ComPtr<ID3D11RenderTargetView> m_rtv[6];
ComPtr<ID3D11ShaderResourceView> m_srv[6];
ComPtr<ID3D11Texture2D> m_depthTex; ComPtr<ID3D11Texture2D> m_depthTex;
ComPtr<ID3D11DepthStencilView> m_dsv[6]; ComPtr<ID3D11DepthStencilView> m_dsv[6];
ComPtr<ID3D11Texture2D> m_colorBindTex;
ComPtr<ID3D11RenderTargetView> m_colorBindRtv[6];
ComPtr<ID3D11ShaderResourceView> m_colorSrv; ComPtr<ID3D11ShaderResourceView> m_colorSrv;
~D3D11TextureCubeR() = default; ~D3D11TextureCubeR() = default;
@ -945,13 +918,14 @@ struct D3D11ShaderDataBinding : public GraphicsDataNode<IShaderDataBinding> {
} }
}; };
struct D3D11CommandQueue : IGraphicsCommandQueue { struct D3D11CommandQueue final : IGraphicsCommandQueue {
Platform platform() const { return IGraphicsDataFactory::Platform::D3D11; } Platform platform() const { return IGraphicsDataFactory::Platform::D3D11; }
const SystemChar* platformName() const { return _SYS_STR("D3D11"); } const SystemChar* platformName() const { return _SYS_STR("D3D11"); }
D3D11Context* m_ctx; D3D11Context* m_ctx;
D3D11Context::Window* m_windowCtx; D3D11Context::Window* m_windowCtx;
IGraphicsContext* m_parent; IGraphicsContext* m_parent;
ComPtr<ID3D11DeviceContext1> m_deferredCtx; ComPtr<ID3D11DeviceContext1> m_deferredCtx;
ComPtr<ID3DUserDefinedAnnotation> m_deferredAnnot;
size_t m_fillBuf = 0; size_t m_fillBuf = 0;
size_t m_completeBuf = 0; size_t m_completeBuf = 0;
@ -987,6 +961,7 @@ struct D3D11CommandQueue : IGraphicsCommandQueue {
m_initcv.wait(m_initlk); m_initcv.wait(m_initlk);
m_initlk.unlock(); m_initlk.unlock();
ThrowIfFailed(ctx->m_dev->CreateDeferredContext1(0, &m_deferredCtx)); ThrowIfFailed(ctx->m_dev->CreateDeferredContext1(0, &m_deferredCtx));
m_deferredCtx.As(&m_deferredAnnot);
} }
void startRenderer(); void startRenderer();
@ -1021,8 +996,10 @@ struct D3D11CommandQueue : IGraphicsCommandQueue {
m_boundTarget = target.get(); m_boundTarget = target.get();
} }
static constexpr int CubeFaceRemap[] = {0, 1, 3, 2, 4, 5};
int m_boundFace = 0; int m_boundFace = 0;
void setRenderTarget(const ObjToken<ITextureCubeR>& target, int face) { void setRenderTarget(const ObjToken<ITextureCubeR>& target, int face) {
face = CubeFaceRemap[face];
D3D11TextureCubeR* ctarget = target.cast<D3D11TextureCubeR>(); D3D11TextureCubeR* ctarget = target.cast<D3D11TextureCubeR>();
ID3D11RenderTargetView* view[] = {ctarget->m_rtv[face].Get()}; ID3D11RenderTargetView* view[] = {ctarget->m_rtv[face].Get()};
m_deferredCtx->OMSetRenderTargets(1, view, ctarget->m_dsv[face].Get()); m_deferredCtx->OMSetRenderTargets(1, view, ctarget->m_dsv[face].Get());
@ -1181,6 +1158,18 @@ struct D3D11CommandQueue : IGraphicsCommandQueue {
void resolveDisplay(const boo::ObjToken<ITextureR>& source) { m_doPresent = source; } void resolveDisplay(const boo::ObjToken<ITextureR>& source) { m_doPresent = source; }
void execute(); void execute();
#ifdef BOO_GRAPHICS_DEBUG_GROUPS
void pushDebugGroup(const char* name, const std::array<float, 4>& color) {
if (m_deferredAnnot)
m_deferredAnnot->BeginEvent(MBSTWCS(name).c_str());
}
void popDebugGroup() {
if (m_deferredAnnot)
m_deferredAnnot->EndEvent();
}
#endif
}; };
template <class DataCls> template <class DataCls>
@ -1257,8 +1246,6 @@ class D3D11DataFactoryImpl : public D3D11DataFactory, public GraphicsDataFactory
ObjToken<ITextureD> m_gammaLUT; ObjToken<ITextureD> m_gammaLUT;
ObjToken<IGraphicsBufferS> m_gammaVBO; ObjToken<IGraphicsBufferS> m_gammaVBO;
ObjToken<IShaderDataBinding> m_gammaBinding; ObjToken<IShaderDataBinding> m_gammaBinding;
ObjToken<IGraphicsBufferS> m_flipVBO;
ObjToken<IShaderPipeline> m_flipShader;
void SetupGammaResources() { void SetupGammaResources() {
commitTransaction([this](IGraphicsDataFactory::Context& ctx) { commitTransaction([this](IGraphicsDataFactory::Context& ctx) {
auto vertexHlsl = D3D11DataFactory::CompileHLSL(GammaVS, PipelineStage::Vertex); auto vertexHlsl = D3D11DataFactory::CompileHLSL(GammaVS, PipelineStage::Vertex);
@ -1283,16 +1270,6 @@ class D3D11DataFactoryImpl : public D3D11DataFactory, public GraphicsDataFactory
m_gammaBinding = ctx.newShaderDataBinding(m_gammaShader, m_gammaVBO.get(), {}, {}, 0, nullptr, nullptr, 2, texs, m_gammaBinding = ctx.newShaderDataBinding(m_gammaShader, m_gammaVBO.get(), {}, {}, 0, nullptr, nullptr, 2, texs,
nullptr, nullptr); nullptr, nullptr);
Vert flipverts[4] = {{{-1.f, 1.f, 0.f, 1.f}, {0.f, 1.f, 0.f, 0.f}},
{{1.f, 1.f, 0.f, 1.f}, {1.f, 1.f, 0.f, 0.f}},
{{-1.f, -1.f, 0.f, 1.f}, {0.f, 0.f, 0.f, 0.f}},
{{1.f, -1.f, 0.f, 1.f}, {1.f, 0.f, 0.f, 0.f}}};
m_flipVBO = ctx.newStaticBuffer(BufferUse::Vertex, flipverts, 32, 4);
fragmentHlsl = D3D11DataFactory::CompileHLSL(FlipFS, PipelineStage::Fragment);
fragmentShader = ctx.newShaderStage(fragmentHlsl, PipelineStage::Fragment);
m_flipShader = ctx.newShaderPipeline(vertexShader, fragmentShader, vfmt, info);
return true; return true;
} BooTrace); } BooTrace);
} }
@ -1335,28 +1312,6 @@ public:
void D3D11CommandQueue::generateMipmaps(const ObjToken<ITextureCubeR>& tex) { void D3D11CommandQueue::generateMipmaps(const ObjToken<ITextureCubeR>& tex) {
D3D11TextureCubeR* ctex = tex.cast<D3D11TextureCubeR>(); D3D11TextureCubeR* ctex = tex.cast<D3D11TextureCubeR>();
D3D11DataFactoryImpl* dataFactory = static_cast<D3D11DataFactoryImpl*>(m_parent->getDataFactory());
D3D11ShaderPipeline* shader = dataFactory->m_flipShader.cast<D3D11ShaderPipeline>();
shader->bind(m_deferredCtx.Get());
ID3D11Buffer* buffers[] = {dataFactory->m_flipVBO.cast<D3D11GraphicsBufferS>()->m_buf.Get()};
UINT strides[] = {32};
UINT offsets[] = {0};
m_deferredCtx->IASetVertexBuffers(0, 1, buffers, strides, offsets);
D3D11_VIEWPORT vp = {0.f, 0.f, FLOAT(ctex->m_width), FLOAT(ctex->m_width), 0.f, 1.f};
m_deferredCtx->RSSetViewports(1, &vp);
D3D11_RECT d3drect = {0, 0, LONG(ctex->m_width), LONG(ctex->m_width)};
m_deferredCtx->RSSetScissorRects(1, &d3drect);
for (int i = 0; i < 6; ++i) {
ID3D11ShaderResourceView* resViews[] = {ctex->m_srv[i].Get()};
m_deferredCtx->PSSetShaderResources(0, 1, resViews);
ID3D11RenderTargetView* views[] = {ctex->m_colorBindRtv[i].Get()};
m_deferredCtx->OMSetRenderTargets(1, views, nullptr);
m_deferredCtx->Draw(4, 0);
}
m_deferredCtx->GenerateMips(ctex->m_colorSrv.Get()); m_deferredCtx->GenerateMips(ctex->m_colorSrv.Get());
} }

View File

@ -30,7 +30,7 @@
** THE POSSIBILITY OF SUCH DAMAGE. ** THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "boo/graphicsdev/glew.h" #include "glew.h"
#if defined(GLEW_OSMESA) #if defined(GLEW_OSMESA)
# define GLAPI extern # define GLAPI extern
@ -38,9 +38,9 @@
#elif defined(GLEW_EGL) #elif defined(GLEW_EGL)
# include <GL/eglew.h> # include <GL/eglew.h>
#elif defined(_WIN32) #elif defined(_WIN32)
# include "boo/graphicsdev/wglew.h" # include "wglew.h"
#elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX)) #elif !defined(__ANDROID__) && !defined(__native_client__) && !defined(__HAIKU__) && (!defined(__APPLE__) || defined(GLEW_APPLE_GLX))
# include "boo/graphicsdev/glxew.h" # include "glxew.h"
#endif #endif
#include <stddef.h> /* For size_t */ #include <stddef.h> /* For size_t */

View File

@ -6,8 +6,8 @@
#include <cstdio> #include <cstdio>
#include <memory.h> #include <memory.h>
#ifdef _WIN32 #ifdef _MSC_VER
constexpr uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); } inline uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); }
#elif __GNUC__ && !defined(__FreeBSD__) #elif __GNUC__ && !defined(__FreeBSD__)
constexpr uint16_t bswap16(uint16_t val) { return __builtin_bswap16(val); } constexpr uint16_t bswap16(uint16_t val) { return __builtin_bswap16(val); }
#elif !defined(__FreeBSD__) #elif !defined(__FreeBSD__)

View File

@ -69,16 +69,16 @@ class HIDDeviceWinUSB final : public IHIDDevice {
CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (INVALID_HANDLE_VALUE == device->m_devHandle) { if (INVALID_HANDLE_VALUE == device->m_devHandle) {
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); device->m_token.getProductName(), device->m_devPath, GetLastError());
lk.unlock(); lk.unlock();
device->m_initCond.notify_one(); device->m_initCond.notify_one();
return; return;
} }
if (!WinUsb_Initialize(device->m_devHandle, &device->m_usbHandle)) { if (!WinUsb_Initialize(device->m_devHandle, &device->m_usbHandle)) {
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); device->m_token.getProductName(), device->m_devPath, GetLastError());
lk.unlock(); lk.unlock();
device->m_initCond.notify_one(); device->m_initCond.notify_one();
CloseHandle(device->m_devHandle); CloseHandle(device->m_devHandle);
@ -88,8 +88,8 @@ class HIDDeviceWinUSB final : public IHIDDevice {
/* Enumerate device pipes */ /* Enumerate device pipes */
USB_INTERFACE_DESCRIPTOR ifDesc = {0}; USB_INTERFACE_DESCRIPTOR ifDesc = {0};
if (!WinUsb_QueryInterfaceSettings(device->m_usbHandle, 0, &ifDesc)) { if (!WinUsb_QueryInterfaceSettings(device->m_usbHandle, 0, &ifDesc)) {
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); device->m_token.getProductName(), device->m_devPath, GetLastError());
lk.unlock(); lk.unlock();
device->m_initCond.notify_one(); device->m_initCond.notify_one();
CloseHandle(device->m_devHandle); CloseHandle(device->m_devHandle);
@ -153,16 +153,16 @@ class HIDDeviceWinUSB final : public IHIDDevice {
CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CreateFileA(device->m_devPath.data(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
if (INVALID_HANDLE_VALUE == device->m_hidHandle) { if (INVALID_HANDLE_VALUE == device->m_hidHandle) {
device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"),
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); device->m_token.getProductName(), device->m_devPath, GetLastError());
lk.unlock(); lk.unlock();
device->m_initCond.notify_one(); device->m_initCond.notify_one();
return; return;
} }
if (!HidD_GetPreparsedData(device->m_hidHandle, &device->m_preparsedData)) { if (!HidD_GetPreparsedData(device->m_hidHandle, &device->m_preparsedData)) {
device->m_devImp->deviceError(fmt::format(fmt("Unable get preparsed data of {}@{}: {}\n"), device->m_devImp->deviceError(fmt("Unable get preparsed data of {}@{}: {}\n"),
device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); device->m_token.getProductName(), device->m_devPath, GetLastError());
lk.unlock(); lk.unlock();
device->m_initCond.notify_one(); device->m_initCond.notify_one();
return; return;

View File

@ -32,6 +32,8 @@ std::condition_variable g_nwcv;
static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
pD3DCompile D3DCompilePROC = nullptr; pD3DCompile D3DCompilePROC = nullptr;
pD3DCreateBlob D3DCreateBlobPROC = nullptr; pD3DCreateBlob D3DCreateBlobPROC = nullptr;
pD3DPERF_BeginEvent D3DPERF_BeginEventPROC = nullptr;
pD3DPERF_EndEvent D3DPERF_EndEventPROC = nullptr;
static bool FindBestD3DCompile() { static bool FindBestD3DCompile() {
HMODULE d3dCompilelib = LoadLibraryW(L"D3DCompiler_47.dll"); HMODULE d3dCompilelib = LoadLibraryW(L"D3DCompiler_47.dll");
@ -55,6 +57,16 @@ static bool FindBestD3DCompile() {
return false; return false;
} }
static bool FindD3DPERF() {
HMODULE d3d9lib = LoadLibraryW(L"d3d9.dll");
if (d3d9lib) {
D3DPERF_BeginEventPROC = (pD3DPERF_BeginEvent)GetProcAddress(d3d9lib, "D3DPERF_BeginEvent");
D3DPERF_EndEventPROC = (pD3DPERF_EndEvent)GetProcAddress(d3d9lib, "D3DPERF_EndEvent");
return D3DPERF_BeginEventPROC != nullptr && D3DPERF_EndEventPROC != nullptr;
}
return false;
}
namespace boo { namespace boo {
static logvisor::Module Log("boo::ApplicationWin32"); static logvisor::Module Log("boo::ApplicationWin32");
Win32Cursors WIN32_CURSORS; Win32Cursors WIN32_CURSORS;
@ -150,6 +162,8 @@ public:
if (d3d11lib) { if (d3d11lib) {
if (!FindBestD3DCompile()) if (!FindBestD3DCompile())
Log.report(logvisor::Fatal, fmt("unable to find D3DCompile_[43-47].dll")); Log.report(logvisor::Fatal, fmt("unable to find D3DCompile_[43-47].dll"));
if (!FindD3DPERF())
Log.report(logvisor::Fatal, fmt("unable to find d3d9.dll"));
/* Create device proc */ /* Create device proc */
PFN_D3D11_CREATE_DEVICE MyD3D11CreateDevice = PFN_D3D11_CREATE_DEVICE MyD3D11CreateDevice =

View File

@ -23,6 +23,11 @@ class IWindow;
#error Unsupported Windows target #error Unsupported Windows target
#endif #endif
#include <d3d9.h>
typedef int (WINAPI *pD3DPERF_BeginEvent)(D3DCOLOR col, LPCWSTR wszName);
typedef int (WINAPI *pD3DPERF_EndEvent)();
struct D3D12Context { struct D3D12Context {
ComPtr<IDXGIFactory2> m_dxFactory; ComPtr<IDXGIFactory2> m_dxFactory;
ComPtr<ID3D12Device> m_dev; ComPtr<ID3D12Device> m_dev;

@ -1 +1 @@
Subproject commit 3bedd268e86fa8c4e83eb5dd45755732a32acdcd Subproject commit dcd0ffcaece7f9ea3785d0ffca30a82cd60c573c