From af50bc0bc21855dbe2b49cb5b40fdde1f4a925f9 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Sat, 27 Jul 2019 15:19:25 -1000 Subject: [PATCH] Windows build fixes --- CMakeLists.txt | 23 +++--- lib/audiodev/WASAPI.cpp | 30 ++++---- lib/graphicsdev/D3D11.cpp | 123 ++++++++++--------------------- lib/graphicsdev/glew.c | 6 +- lib/inputdev/DualshockPad.cpp | 4 +- lib/inputdev/HIDDeviceWinUSB.cpp | 20 ++--- lib/win/ApplicationWin32.cpp | 14 ++++ lib/win/WinCommon.hpp | 5 ++ logvisor | 2 +- 9 files changed, 102 insertions(+), 125 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e9c997..783e5a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,7 @@ add_subdirectory(xxhash) option(BOO_GRAPHICS_DEBUG_GROUPS "Enable Debug Groups for labeling graphics passes within backend API." OFF) if (BOO_GRAPHICS_DEBUG_GROUPS) + message(STATUS "Enabling graphics debug groups") list(APPEND _BOO_SYS_DEFINES -DBOO_GRAPHICS_DEBUG_GROUPS=1) endif() @@ -41,16 +42,19 @@ if(TARGET nx_compiler) endif() if(NOT GEKKO AND NOT CAFE AND NOT WINDOWS_STORE AND NOT NX AND NOT APPLE) -list(APPEND PLAT_SRCS - lib/graphicsdev/GL.cpp - lib/graphicsdev/glew.c) -list(APPEND _BOO_SYS_DEFINES -DBOO_HAS_GL=1 -DGLEW_NO_GLU=1) + add_library(glew lib/graphicsdev/glew.c) + target_include_directories(glew PUBLIC include/boo/graphicsdev) + target_compile_definitions(glew PUBLIC -DGLEW_NO_GLU=1) -list(APPEND PLAT_HDRS - include/boo/graphicsdev/GLSLMacros.hpp - include/boo/graphicsdev/GL.hpp - include/boo/graphicsdev/Vulkan.hpp - include/boo/graphicsdev/VulkanDispatchTable.hpp) + list(APPEND PLAT_SRCS lib/graphicsdev/GL.cpp) + list(APPEND _BOO_SYS_DEFINES -DBOO_HAS_GL=1) + list(APPEND _BOO_SYS_LIBS glew) + + 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() if(WINDOWS_STORE) @@ -173,7 +177,6 @@ else(NOT GEKKO) lib/x11/WindowWayland.cpp lib/graphicsdev/GL.cpp lib/graphicsdev/GLX.cpp - lib/graphicsdev/glew.c lib/audiodev/LinuxMidi.hpp) find_package(PkgConfig) diff --git a/lib/audiodev/WASAPI.cpp b/lib/audiodev/WASAPI.cpp index 55bb15a..78f0088 100644 --- a/lib/audiodev/WASAPI.cpp +++ b/lib/audiodev/WASAPI.cpp @@ -117,14 +117,14 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { #if !WINDOWS_STORE if (!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(); return; } } 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(); return; } @@ -132,7 +132,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { WAVEFORMATEXTENSIBLE* 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 m_device.Reset(); #endif @@ -210,7 +210,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { /* Initialize audio client */ if (FAILED(m_audClient->Initialize(AUDCLNT_SHAREMODE_SHARED, 0, 450000, /* 45ms */ 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 m_device.Reset(); #endif @@ -231,7 +231,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { m_mixInfo.m_sampleFormat = SOXR_INT32_I; m_mixInfo.m_bitsPerSample = 32; } 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 m_device.Reset(); #endif @@ -244,7 +244,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { m_mixInfo.m_sampleFormat = SOXR_FLOAT32_I; m_mixInfo.m_bitsPerSample = 32; } 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 m_device.Reset(); #endif @@ -256,7 +256,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { UINT32 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 m_device.Reset(); #endif @@ -265,7 +265,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { m_mixInfo.m_periodFrames = bufferFrameCount; 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 m_device.Reset(); #endif @@ -342,18 +342,18 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { /* Enumerate default audio device */ if (FAILED( 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; } 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(); return; } 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(); return; } @@ -381,7 +381,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { m_started = false; 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(); } @@ -398,7 +398,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { int attempt = 0; while (true) { 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) { m_device.Reset(); @@ -468,7 +468,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { bool setCurrentAudioOutput(const char* name) { ComPtr 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; } m_device = newDevice; @@ -482,7 +482,7 @@ struct WASAPIAudioVoiceEngine : BaseAudioVoiceEngine { ComPtr 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; } diff --git a/lib/graphicsdev/D3D11.cpp b/lib/graphicsdev/D3D11.cpp index 093f6e2..e1a360a 100644 --- a/lib/graphicsdev/D3D11.cpp +++ b/lib/graphicsdev/D3D11.cpp @@ -18,6 +18,8 @@ #undef max extern pD3DCompile D3DCompilePROC; +extern pD3DPERF_BeginEvent D3DPERF_BeginEventPROC; +extern pD3DPERF_EndEvent D3DPERF_EndEventPROC; static const char* GammaVS = "struct VertData\n" @@ -59,20 +61,6 @@ static const char* GammaFS = " return colorOut;\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 { static logvisor::Module Log("boo::D3D11"); class D3D11DataFactory; @@ -86,7 +74,7 @@ static inline void ThrowIfFailed(HRESULT hr) { _com_error err(hr, L"D3D11 fail"); #endif 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 { } 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)); } @@ -261,7 +249,7 @@ class D3D11TextureSA : public GraphicsDataNode { } 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)); } @@ -307,9 +295,9 @@ class D3D11TextureD : public GraphicsDataNode { CD3D11_TEXTURE2D_DESC desc(pixelFmt, width, height, 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_DYNAMIC, D3D11_CPU_ACCESS_WRITE); + CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(D3D_SRV_DIMENSION_TEXTURE2D, pixelFmt, 0, 1); for (int i = 0; i < 3; ++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])); } } @@ -356,25 +344,24 @@ class D3D11TextureR : public GraphicsDataNode { 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)); - 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)); + 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) { - 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])); - 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])); } + 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) { - 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])); - 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])); } } @@ -432,37 +419,26 @@ class D3D11TextureCubeR : public GraphicsDataNode { size_t m_mipCount = 0; 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_RESOURCE_MISC_TEXTURECUBE); + D3D11_RESOURCE_MISC_TEXTURECUBE | D3D11_RESOURCE_MISC_GENERATE_MIPS); 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, D3D11_USAGE_DEFAULT, 0, 1, 0, D3D11_RESOURCE_MISC_TEXTURECUBE); ThrowIfFailed(ctx->m_dev->CreateTexture2D(&depthDesc, nullptr, &m_depthTex)); - D3D11_RTV_DIMENSION rtvDim = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; - D3D11_DSV_DIMENSION dsvDim = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; - + CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(D3D11_RTV_DIMENSION_TEXTURE2DARRAY, ctx->m_fbFormat, 0, 0, 1); + CD3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc(D3D11_DSV_DIMENSION_TEXTURE2DARRAY, DXGI_FORMAT_D32_FLOAT, 0, 0, 1); 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])); - 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])); - 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, - 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, + CD3D11_SHADER_RESOURCE_VIEW_DESC colorSrvDesc(D3D11_SRV_DIMENSION_TEXTURECUBE, 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& parent, D3D11Context* ctx, size_t width, size_t mips) @@ -473,13 +449,10 @@ class D3D11TextureCubeR : public GraphicsDataNode { public: ComPtr m_colorTex; ComPtr m_rtv[6]; - ComPtr m_srv[6]; ComPtr m_depthTex; ComPtr m_dsv[6]; - ComPtr m_colorBindTex; - ComPtr m_colorBindRtv[6]; ComPtr m_colorSrv; ~D3D11TextureCubeR() = default; @@ -945,13 +918,14 @@ struct D3D11ShaderDataBinding : public GraphicsDataNode { } }; -struct D3D11CommandQueue : IGraphicsCommandQueue { +struct D3D11CommandQueue final : IGraphicsCommandQueue { Platform platform() const { return IGraphicsDataFactory::Platform::D3D11; } const SystemChar* platformName() const { return _SYS_STR("D3D11"); } D3D11Context* m_ctx; D3D11Context::Window* m_windowCtx; IGraphicsContext* m_parent; ComPtr m_deferredCtx; + ComPtr m_deferredAnnot; size_t m_fillBuf = 0; size_t m_completeBuf = 0; @@ -987,6 +961,7 @@ struct D3D11CommandQueue : IGraphicsCommandQueue { m_initcv.wait(m_initlk); m_initlk.unlock(); ThrowIfFailed(ctx->m_dev->CreateDeferredContext1(0, &m_deferredCtx)); + m_deferredCtx.As(&m_deferredAnnot); } void startRenderer(); @@ -1021,8 +996,10 @@ struct D3D11CommandQueue : IGraphicsCommandQueue { m_boundTarget = target.get(); } + static constexpr int CubeFaceRemap[] = {0, 1, 3, 2, 4, 5}; int m_boundFace = 0; void setRenderTarget(const ObjToken& target, int face) { + face = CubeFaceRemap[face]; D3D11TextureCubeR* ctarget = target.cast(); ID3D11RenderTargetView* view[] = {ctarget->m_rtv[face].Get()}; m_deferredCtx->OMSetRenderTargets(1, view, ctarget->m_dsv[face].Get()); @@ -1181,6 +1158,18 @@ struct D3D11CommandQueue : IGraphicsCommandQueue { void resolveDisplay(const boo::ObjToken& source) { m_doPresent = source; } void execute(); + +#ifdef BOO_GRAPHICS_DEBUG_GROUPS + void pushDebugGroup(const char* name, const std::array& color) { + if (m_deferredAnnot) + m_deferredAnnot->BeginEvent(MBSTWCS(name).c_str()); + } + + void popDebugGroup() { + if (m_deferredAnnot) + m_deferredAnnot->EndEvent(); + } +#endif }; template @@ -1257,8 +1246,6 @@ class D3D11DataFactoryImpl : public D3D11DataFactory, public GraphicsDataFactory ObjToken m_gammaLUT; ObjToken m_gammaVBO; ObjToken m_gammaBinding; - ObjToken m_flipVBO; - ObjToken m_flipShader; void SetupGammaResources() { commitTransaction([this](IGraphicsDataFactory::Context& ctx) { 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, 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; } BooTrace); } @@ -1335,28 +1312,6 @@ public: void D3D11CommandQueue::generateMipmaps(const ObjToken& tex) { D3D11TextureCubeR* ctex = tex.cast(); - D3D11DataFactoryImpl* dataFactory = static_cast(m_parent->getDataFactory()); - D3D11ShaderPipeline* shader = dataFactory->m_flipShader.cast(); - shader->bind(m_deferredCtx.Get()); - ID3D11Buffer* buffers[] = {dataFactory->m_flipVBO.cast()->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()); } diff --git a/lib/graphicsdev/glew.c b/lib/graphicsdev/glew.c index 6ad87c4..85ef07b 100644 --- a/lib/graphicsdev/glew.c +++ b/lib/graphicsdev/glew.c @@ -30,7 +30,7 @@ ** THE POSSIBILITY OF SUCH DAMAGE. */ -#include "boo/graphicsdev/glew.h" +#include "glew.h" #if defined(GLEW_OSMESA) # define GLAPI extern @@ -38,9 +38,9 @@ #elif defined(GLEW_EGL) # include #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)) -# include "boo/graphicsdev/glxew.h" +# include "glxew.h" #endif #include /* For size_t */ diff --git a/lib/inputdev/DualshockPad.cpp b/lib/inputdev/DualshockPad.cpp index 848e726..818c2df 100644 --- a/lib/inputdev/DualshockPad.cpp +++ b/lib/inputdev/DualshockPad.cpp @@ -6,8 +6,8 @@ #include #include -#ifdef _WIN32 -constexpr uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); } +#ifdef _MSC_VER +inline uint16_t bswap16(uint16_t val) { return _byteswap_ushort(val); } #elif __GNUC__ && !defined(__FreeBSD__) constexpr uint16_t bswap16(uint16_t val) { return __builtin_bswap16(val); } #elif !defined(__FreeBSD__) diff --git a/lib/inputdev/HIDDeviceWinUSB.cpp b/lib/inputdev/HIDDeviceWinUSB.cpp index 1b3737a..2e6a3dd 100644 --- a/lib/inputdev/HIDDeviceWinUSB.cpp +++ b/lib/inputdev/HIDDeviceWinUSB.cpp @@ -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, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (INVALID_HANDLE_VALUE == device->m_devHandle) { - device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), - device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); + device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"), + device->m_token.getProductName(), device->m_devPath, GetLastError()); lk.unlock(); device->m_initCond.notify_one(); return; } if (!WinUsb_Initialize(device->m_devHandle, &device->m_usbHandle)) { - device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), - device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); + device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"), + device->m_token.getProductName(), device->m_devPath, GetLastError()); lk.unlock(); device->m_initCond.notify_one(); CloseHandle(device->m_devHandle); @@ -88,8 +88,8 @@ class HIDDeviceWinUSB final : public IHIDDevice { /* Enumerate device pipes */ USB_INTERFACE_DESCRIPTOR ifDesc = {0}; if (!WinUsb_QueryInterfaceSettings(device->m_usbHandle, 0, &ifDesc)) { - device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), - device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); + device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"), + device->m_token.getProductName(), device->m_devPath, GetLastError()); lk.unlock(); device->m_initCond.notify_one(); 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, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); if (INVALID_HANDLE_VALUE == device->m_hidHandle) { - device->m_devImp->deviceError(fmt::format(fmt("Unable to open {}@{}: {}\n"), - device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); + device->m_devImp->deviceError(fmt("Unable to open {}@{}: {}\n"), + device->m_token.getProductName(), device->m_devPath, GetLastError()); lk.unlock(); device->m_initCond.notify_one(); return; } if (!HidD_GetPreparsedData(device->m_hidHandle, &device->m_preparsedData)) { - device->m_devImp->deviceError(fmt::format(fmt("Unable get preparsed data of {}@{}: {}\n"), - device->m_token.getProductName(), device->m_devPath, GetLastError()).c_str()); + device->m_devImp->deviceError(fmt("Unable get preparsed data of {}@{}: {}\n"), + device->m_token.getProductName(), device->m_devPath, GetLastError()); lk.unlock(); device->m_initCond.notify_one(); return; diff --git a/lib/win/ApplicationWin32.cpp b/lib/win/ApplicationWin32.cpp index 62a0784..bbfbbfe 100644 --- a/lib/win/ApplicationWin32.cpp +++ b/lib/win/ApplicationWin32.cpp @@ -32,6 +32,8 @@ std::condition_variable g_nwcv; static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); pD3DCompile D3DCompilePROC = nullptr; pD3DCreateBlob D3DCreateBlobPROC = nullptr; +pD3DPERF_BeginEvent D3DPERF_BeginEventPROC = nullptr; +pD3DPERF_EndEvent D3DPERF_EndEventPROC = nullptr; static bool FindBestD3DCompile() { HMODULE d3dCompilelib = LoadLibraryW(L"D3DCompiler_47.dll"); @@ -55,6 +57,16 @@ static bool FindBestD3DCompile() { 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 { static logvisor::Module Log("boo::ApplicationWin32"); Win32Cursors WIN32_CURSORS; @@ -150,6 +162,8 @@ public: if (d3d11lib) { if (!FindBestD3DCompile()) 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 */ PFN_D3D11_CREATE_DEVICE MyD3D11CreateDevice = diff --git a/lib/win/WinCommon.hpp b/lib/win/WinCommon.hpp index a1c167f..ac26c19 100644 --- a/lib/win/WinCommon.hpp +++ b/lib/win/WinCommon.hpp @@ -23,6 +23,11 @@ class IWindow; #error Unsupported Windows target #endif +#include + +typedef int (WINAPI *pD3DPERF_BeginEvent)(D3DCOLOR col, LPCWSTR wszName); +typedef int (WINAPI *pD3DPERF_EndEvent)(); + struct D3D12Context { ComPtr m_dxFactory; ComPtr m_dev; diff --git a/logvisor b/logvisor index 3bedd26..dcd0ffc 160000 --- a/logvisor +++ b/logvisor @@ -1 +1 @@ -Subproject commit 3bedd268e86fa8c4e83eb5dd45755732a32acdcd +Subproject commit dcd0ffcaece7f9ea3785d0ffca30a82cd60c573c