From 599992c8f188d58f26a7008a9a5c9a523645428d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Thu, 13 Oct 2016 15:01:27 -0700 Subject: [PATCH] Added ability to specify api thread wait timeout. Fixed HLSL compiler. --- examples/runtime/.gitignore | 2 -- scripts/shaderc.lua | 22 +++++++++++++++------- src/bgfx.cpp | 29 +++++++++++++++-------------- src/bgfx_p.h | 26 +++++++++++++++++--------- src/bgfx_shader.sh | 2 +- src/config.h | 4 ++++ tools/shaderc/shaderc_hlsl.cpp | 4 ++-- 7 files changed, 54 insertions(+), 35 deletions(-) diff --git a/examples/runtime/.gitignore b/examples/runtime/.gitignore index c9a7e5768..5394aa127 100644 --- a/examples/runtime/.gitignore +++ b/examples/runtime/.gitignore @@ -2,5 +2,3 @@ *.so *.pdb imgui* -shaders/pssl/* -shaders/spirv/* diff --git a/scripts/shaderc.lua b/scripts/shaderc.lua index 052286f09..3942b6917 100644 --- a/scripts/shaderc.lua +++ b/scripts/shaderc.lua @@ -114,16 +114,24 @@ project "shaderc" path.join(GLSL_OPTIMIZER, "src/glsl/builtin_stubs.cpp"), } - overridefiles(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-ext"), { - path.join(BGFX_DIR, "tools/shaderc/shaderc_pssl.cpp"), - }) - if filesexist(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-ext"), { path.join(BGFX_DIR, "scripts/shaderc.lua"), }) then - removefiles { - path.join(BGFX_DIR, "tools/shaderc/shaderc_spirv.cpp"), - } + if filesexist(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-ext"), { + path.join(BGFX_DIR, "tools/shaderc/shaderc_pssl.cpp"), }) then + + removefiles { + path.join(BGFX_DIR, "tools/shaderc/shaderc_pssl.cpp"), + } + end + + if filesexist(BGFX_DIR, path.join(BGFX_DIR, "../bgfx-ext"), { + path.join(BGFX_DIR, "tools/shaderc/shaderc_spirv.cpp"), }) then + + removefiles { + path.join(BGFX_DIR, "tools/shaderc/shaderc_spirv.cpp"), + } + end dofile(path.join(BGFX_DIR, "../bgfx-ext/scripts/shaderc.lua") ) end diff --git a/src/bgfx.cpp b/src/bgfx.cpp index 812380c42..17ff594f8 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -980,7 +980,7 @@ namespace bgfx if (s_ctx->renderFrame() ) { Context* ctx = s_ctx; - ctx->gameSemWait(); + ctx->apiSemWait(); s_ctx = NULL; ctx->renderSemPost(); return RenderFrame::Exiting; @@ -1568,22 +1568,23 @@ namespace bgfx m_renderCtx->flip(m_render->m_hmd); } - gameSemWait(); - - rendererExecCommands(m_render->m_cmdPre); - if (m_rendererInitialized) + if (apiSemWait(BGFX_CONFIG_API_SEMAPHORE_TIMEOUT) ) { - BGFX_PROFILER_SCOPE(bgfx, render_submit, 0xff2040ff); - m_renderCtx->submit(m_render, m_clearQuad, m_textVideoMemBlitter); - } - rendererExecCommands(m_render->m_cmdPost); + rendererExecCommands(m_render->m_cmdPre); + if (m_rendererInitialized) + { + BGFX_PROFILER_SCOPE(bgfx, render_submit, 0xff2040ff); + m_renderCtx->submit(m_render, m_clearQuad, m_textVideoMemBlitter); + } + rendererExecCommands(m_render->m_cmdPost); - renderSemPost(); + renderSemPost(); - if (m_rendererInitialized - && m_flipAfterRender) - { - m_renderCtx->flip(m_render->m_hmd); + if (m_rendererInitialized + && m_flipAfterRender) + { + m_renderCtx->flip(m_render->m_hmd); + } } return m_exit; diff --git a/src/bgfx_p.h b/src/bgfx_p.h index a5f918f67..6b234a66d 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -3976,21 +3976,28 @@ namespace bgfx { if (!m_singleThreaded) { - m_gameSem.post(); + m_apiSem.post(); } } - void gameSemWait() + bool apiSemWait(int32_t _msecs = -1) { - if (!m_singleThreaded) + if (m_singleThreaded) + { + return true; + } + + BGFX_PROFILER_SCOPE(bgfx, main_thread_wait, 0xff2040ff); + int64_t start = bx::getHPCounter(); + bool ok = m_apiSem.wait(_msecs); + if (ok) { - BGFX_PROFILER_SCOPE(bgfx, main_thread_wait, 0xff2040ff); - int64_t start = bx::getHPCounter(); - bool ok = m_gameSem.wait(); - BX_CHECK(ok, "Semaphore wait failed."); BX_UNUSED(ok); m_render->m_waitSubmit = bx::getHPCounter()-start; m_submit->m_perfStats.waitSubmit = m_submit->m_waitSubmit; + return true; } + + return false; } void renderSemPost() @@ -4015,15 +4022,16 @@ namespace bgfx } bx::Semaphore m_renderSem; - bx::Semaphore m_gameSem; + bx::Semaphore m_apiSem; bx::Thread m_thread; #else void gameSemPost() { } - void gameSemWait() + bool apiSemWait() { + return true; } void renderSemPost() diff --git a/src/bgfx_shader.sh b/src/bgfx_shader.sh index 7c1782dad..c84e4bdc6 100644 --- a/src/bgfx_shader.sh +++ b/src/bgfx_shader.sh @@ -285,7 +285,7 @@ vec4 bgfxTexelFetch(BgfxSampler3D _sampler, ivec3 _coord, int _lod) # define SAMPLER3D(_name, _reg) \ uniform SamplerState _name ## Sampler : REGISTER(s, _reg); \ - uniform Texture3D _name ## Texture : REGISTER(t[_reg]); \ + uniform Texture3D _name ## Texture : REGISTER(t, _reg); \ static BgfxSampler3D _name = { _name ## Sampler, _name ## Texture } # define ISAMPLER3D(_name, _reg) \ uniform Texture3D _name ## Texture : REGISTER(t, _reg); \ diff --git a/src/config.h b/src/config.h index ddba09051..6ef37b421 100644 --- a/src/config.h +++ b/src/config.h @@ -343,4 +343,8 @@ # define BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS { eRENDERDOC_Key_F11 } #endif // BGFX_CONFIG_RENDERDOC_CAPTURE_KEYS +#ifndef BGFX_CONFIG_API_SEMAPHORE_TIMEOUT +# define BGFX_CONFIG_API_SEMAPHORE_TIMEOUT (-1) +#endif // BGFX_CONFIG_API_SEMAPHORE_TIMEOUT + #endif // BGFX_CONFIG_H_HEADER_GUARD diff --git a/tools/shaderc/shaderc_hlsl.cpp b/tools/shaderc/shaderc_hlsl.cpp index b28af07e0..08067ccaf 100644 --- a/tools/shaderc/shaderc_hlsl.cpp +++ b/tools/shaderc/shaderc_hlsl.cpp @@ -659,7 +659,7 @@ namespace bgfx { namespace hlsl UniformNameList unusedUniforms; if (!getReflectionDataD3D11(code, profile[0] == 'v', uniforms, numAttrs, attrs, size, unusedUniforms) ) { - fprintf(stderr, "Unable to get D3D11 reflection data.\n"); + fprintf(stderr, "Error: Unable to get D3D11 reflection data.\n"); goto error; } @@ -699,7 +699,7 @@ namespace bgfx { namespace hlsl } // recompile with the unused uniforms converted to statics - return compileHLSLShader(_cmdLine, _version, output.c_str(), _writer); + return compile(_cmdLine, _version, output.c_str(), _writer, false); } }