diff --git a/renderdoc.sln b/renderdoc.sln index 90a998c5e..a3de6466c 100644 --- a/renderdoc.sln +++ b/renderdoc.sln @@ -64,6 +64,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shaders", "shaders", "{DB2D EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxbc", "renderdoc\driver\shaders\dxbc\renderdoc_dxbc.vcxproj", "{C43FF27E-A155-4852-88EC-5CE9334C07A8}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spirv", "renderdoc\driver\shaders\spirv\renderdoc_spirv.vcxproj", "{0AAE0AD1-371B-4A36-9ED1-80E10E960605}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Profile|Win32 = Profile|Win32 @@ -176,6 +178,14 @@ Global {C43FF27E-A155-4852-88EC-5CE9334C07A8}.Release|Win32.Build.0 = Release|Win32 {C43FF27E-A155-4852-88EC-5CE9334C07A8}.Release|x64.ActiveCfg = Release|x64 {C43FF27E-A155-4852-88EC-5CE9334C07A8}.Release|x64.Build.0 = Release|x64 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Profile|Win32.ActiveCfg = Profile|Win32 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Profile|Win32.Build.0 = Profile|Win32 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Profile|x64.ActiveCfg = Profile|x64 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Profile|x64.Build.0 = Profile|x64 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Release|Win32.ActiveCfg = Release|Win32 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Release|Win32.Build.0 = Release|Win32 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Release|x64.ActiveCfg = Release|x64 + {0AAE0AD1-371B-4A36-9ED1-80E10E960605}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -198,5 +208,6 @@ Global {F92FCDA6-A261-4EEC-9CD0-73A11FBCC459} = {864A44B0-5612-451A-857F-41E3EF785EF6} {DB2DDA74-A668-4AC7-A1D5-198C9F0BD242} = {864A44B0-5612-451A-857F-41E3EF785EF6} {C43FF27E-A155-4852-88EC-5CE9334C07A8} = {DB2DDA74-A668-4AC7-A1D5-198C9F0BD242} + {0AAE0AD1-371B-4A36-9ED1-80E10E960605} = {DB2DDA74-A668-4AC7-A1D5-198C9F0BD242} EndGlobalSection EndGlobal diff --git a/renderdoc/Makefile b/renderdoc/Makefile index 89f2933e6..f648b480e 100644 --- a/renderdoc/Makefile +++ b/renderdoc/Makefile @@ -8,7 +8,7 @@ MACROS=-DLINUX \ CFLAGS=-c -Wall -Werror -Wno-unused -Wno-unknown-pragmas -fPIC $(MACROS) -I. -I3rdparty/ CPPFLAGS=-std=c++11 -g -Wno-reorder -fvisibility=hidden -fvisibility-inlines-hidden LDFLAGS=-lpthread -lrt -shared -ldl -lX11 -LIBS=driver/gl/rdoc_gl.a +LIBS=driver/gl/rdoc_gl.a driver/shaders/spirv/rdoc_spirv.a OBJDIR=.obj OBJECTS=replay/replay_output.o \ replay/replay_renderer.o \ @@ -64,12 +64,12 @@ all: librenderdoc.so $(OBJDIR)/%.o: %.cpp @mkdir -p $$(dirname $@) $(CPP) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< - @$(CPP) $(CFLAGS) $(CPPFLAGS) -MM -MT $(OBJDIR)/$*.o $*.cpp > $(OBJDIR)/$*.d + @$(CPP) $(CFLAGS) $(CPPFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d $(OBJDIR)/%.o: %.c @mkdir -p $$(dirname $@) $(CC) $(CFLAGS) -c -o $@ $< - @$(CC) $(CFLAGS) -MM -MT $(OBJDIR)/$*.o $*.c > $(OBJDIR)/$*.d + @$(CC) $(CFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d # objcopy needs to be run in with paths in current directory # to produce the right symbol names @@ -104,9 +104,14 @@ OBJDIR_DATA=$(addprefix $(OBJDIR)/, $(DATA)) -include $(OBJDIR_OBJECTS:.o=.d) +.PHONY: driver/gl/rdoc_gl.a driver/gl/rdoc_gl.a: cd driver/gl && make rdoc_gl.a +.PHONY: driver/shaders/spirv/rdoc_spirv.a +driver/shaders/spirv/rdoc_spirv.a: + cd driver/shaders/spirv && make rdoc_spirv.a + librenderdoc.so: $(OBJDIR_OBJECTS) $(OBJDIR_DATA) $(LIBS) $(CPP) -o librenderdoc.so $^ $(LDFLAGS) @@ -114,3 +119,4 @@ librenderdoc.so: $(OBJDIR_OBJECTS) $(OBJDIR_DATA) $(LIBS) clean: rm -rf librenderdoc.so $(OBJDIR) cd driver/gl && make clean + cd driver/shaders/spirv && make clean diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index d52b41797..b7b4e7a10 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -268,6 +268,9 @@ RenderDoc::~RenderDoc() UnloadCrashHandler(); } + for(auto it=m_ShutdownFunctions.begin(); it != m_ShutdownFunctions.end(); ++it) + (*it)(); + for(size_t i=0; i < m_Captures.size(); i++) { if(m_Captures[i].retrieved) diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 17c4b3948..26832ca5a 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -153,6 +153,8 @@ class IReplayDriver; typedef ReplayCreateStatus (*RemoteDriverProvider)(const char *logfile, IRemoteDriver **driver); typedef ReplayCreateStatus (*ReplayDriverProvider)(const char *logfile, IReplayDriver **driver); +typedef void (*ShutdownFunction)(); + // this class mediates everything and owns any 'global' resources such as the crash handler. // // It acts as a central hub that registers any driver providers and can be asked to create one @@ -174,6 +176,8 @@ class RenderDoc void Initialise(); void Shutdown(); + void RegisterShutdownFunction(ShutdownFunction func) { m_ShutdownFunctions.insert(func); } + void SetReplayApp(bool replay) { m_Replay = replay; } bool IsReplayApp() const { return m_Replay; } @@ -317,6 +321,8 @@ class RenderDoc map m_ReplayDriverProviders; map m_RemoteDriverProviders; + set m_ShutdownFunctions; + struct FrameCap { FrameCap() : FrameCapturer(NULL), RefCount(1) {} @@ -369,6 +375,7 @@ class RenderDoc static void RemoteAccessClientThread(void *s); ICrashHandler *m_ExHandler; + bool m_GLSLang; }; struct DriverRegistration diff --git a/renderdoc/driver/gl/Makefile b/renderdoc/driver/gl/Makefile index 31e331930..2552d9543 100644 --- a/renderdoc/driver/gl/Makefile +++ b/renderdoc/driver/gl/Makefile @@ -39,12 +39,12 @@ all: rdoc_gl.a $(OBJDIR)/%.o: %.cpp @mkdir -p $$(dirname $@) $(CPP) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< - @$(CPP) $(CFLAGS) $(CPPFLAGS) -MM -MT $(OBJDIR)/$*.o $*.cpp > $(OBJDIR)/$*.d + @$(CPP) $(CFLAGS) $(CPPFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d $(OBJDIR)/%.o: %.c @mkdir -p $$(dirname $@) $(CC) $(CFLAGS) -c -o $@ $< - @$(CC) $(CFLAGS) -MM -MT $(OBJDIR)/$*.o $*.c > $(OBJDIR)/$*.d + @$(CC) $(CFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d OBJDIR_OBJECTS=$(addprefix $(OBJDIR)/, $(OBJECTS)) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 89d209d47..1efbe60da 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -26,6 +26,8 @@ #include "common/common.h" #include "gl_driver.h" +#include "driver/shaders/spirv/spirv_common.h" + #include "serialise/string_utils.h" #include "replay/type_helpers.h" @@ -766,6 +768,9 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) m_DeviceRecord = m_ContextRecord = NULL; TrackedResource::SetReplayResourceIDs(); + + InitSPIRVCompiler(); + RenderDoc::Inst().RegisterShutdownFunction(&ShutdownSPIRVCompiler); } m_FakeBB_FBO = 0; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 04af03862..dda28303d 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -250,6 +250,7 @@ class WrappedOpenGL : public IFrameCapturer GLenum type; vector sources; vector includepaths; + vector spirv; ShaderReflection reflection; GLuint prog; }; diff --git a/renderdoc/driver/gl/renderdoc_gl.vcxproj b/renderdoc/driver/gl/renderdoc_gl.vcxproj index 958831598..855f2a092 100644 --- a/renderdoc/driver/gl/renderdoc_gl.vcxproj +++ b/renderdoc/driver/gl/renderdoc_gl.vcxproj @@ -64,6 +64,16 @@ + + + {0aae0ad1-371b-4a36-9ed1-80e10e960605} + false + true + false + false + false + + {F92FCDA6-A261-4EEC-9CD0-73A11FBCC459} Win32Proj diff --git a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp index 052169248..77c830758 100644 --- a/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_shader_funcs.cpp @@ -28,6 +28,8 @@ #include "../gl_driver.h" #include "../gl_shader_refl.h" +#include "driver/shaders/spirv/spirv_common.h" + #pragma region Shaders bool WrappedOpenGL::Serialise_glCreateShader(GLuint shader, GLenum type) @@ -165,7 +167,13 @@ bool WrappedOpenGL::Serialise_glCompileShader(GLuint shader) { shadDetails.prog = sepProg; MakeShaderReflection(m_Real, shadDetails.type, sepProg, shadDetails.reflection, pointSizeUsed, clipDistanceUsed); - + + string s = CompileSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.sources, shadDetails.spirv); + if(!shadDetails.spirv.empty()) + DisassembleSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.spirv, s); + + shadDetails.reflection.Disassembly = s; + create_array_uninit(shadDetails.reflection.DebugInfo.files, shadDetails.sources.size()); for(size_t i=0; i < shadDetails.sources.size(); i++) { @@ -356,6 +364,12 @@ bool WrappedOpenGL::Serialise_glCreateShaderProgramv(GLuint program, GLenum type shadDetails.prog = sepprog; MakeShaderReflection(m_Real, Type, real, shadDetails.reflection, pointSizeUsed, clipDistanceUsed); + string s = CompileSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.sources, shadDetails.spirv); + if(!shadDetails.spirv.empty()) + DisassembleSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.spirv, s); + + shadDetails.reflection.Disassembly = s; + create_array_uninit(shadDetails.reflection.DebugInfo.files, shadDetails.sources.size()); for(size_t i=0; i < shadDetails.sources.size(); i++) { @@ -1162,6 +1176,12 @@ bool WrappedOpenGL::Serialise_glCompileShaderIncludeARB(GLuint shader, GLsizei c shadDetails.prog = sepProg; MakeShaderReflection(m_Real, shadDetails.type, sepProg, shadDetails.reflection, pointSizeUsed, clipDistanceUsed); + string s = CompileSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.sources, shadDetails.spirv); + if(!shadDetails.spirv.empty()) + DisassembleSPIRV(SPIRVShaderStage(ShaderIdx(shadDetails.type)), shadDetails.spirv, s); + + shadDetails.reflection.Disassembly = s; + create_array_uninit(shadDetails.reflection.DebugInfo.files, shadDetails.sources.size()); for(size_t i=0; i < shadDetails.sources.size(); i++) { diff --git a/renderdoc/driver/shaders/spirv/Makefile b/renderdoc/driver/shaders/spirv/Makefile new file mode 100644 index 000000000..25df51fdc --- /dev/null +++ b/renderdoc/driver/shaders/spirv/Makefile @@ -0,0 +1,80 @@ +CC=gcc +CPP=g++ +COMMIT=`git rev-parse HEAD` +MACROS=-DLINUX \ + -DRENDERDOC_PLATFORM=linux \ + -DRENDERDOC_EXPORTS \ + -DGIT_COMMIT_HASH="\"$(COMMIT)\"" +CFLAGS=-c -Wall -Werror -Wno-unused -Wno-unknown-pragmas -fPIC $(MACROS) -I../../../ -I../../../3rdparty/ +CPPFLAGS=-std=c++11 -g -Wno-reorder -fvisibility=hidden -fvisibility-inlines-hidden +LDFLAGS=-lpthread -lrt -shared -ldl -lX11 +OBJDIR=.obj + +VPATH=../../../3rdparty + +# VPATH above takes care of finding these within the 3rdparty directory +GLSLANG_OBJECTS=glslang/OGLCompilersDLL/InitializeDll.o \ +glslang/SPIRV/GlslangToSpv.o \ +glslang/SPIRV/SpvBuilder.o \ +glslang/glslang/GenericCodeGen/CodeGen.o \ +glslang/glslang/GenericCodeGen/Link.o \ +glslang/glslang/MachineIndependent/Constant.o \ +glslang/glslang/MachineIndependent/glslang_tab.o \ +glslang/glslang/MachineIndependent/InfoSink.o \ +glslang/glslang/MachineIndependent/Initialize.o \ +glslang/glslang/MachineIndependent/Intermediate.o \ +glslang/glslang/MachineIndependent/intermOut.o \ +glslang/glslang/MachineIndependent/IntermTraverse.o \ +glslang/glslang/MachineIndependent/limits.o \ +glslang/glslang/MachineIndependent/linkValidate.o \ +glslang/glslang/MachineIndependent/parseConst.o \ +glslang/glslang/MachineIndependent/ParseHelper.o \ +glslang/glslang/MachineIndependent/PoolAlloc.o \ +glslang/glslang/MachineIndependent/reflection.o \ +glslang/glslang/MachineIndependent/RemoveTree.o \ +glslang/glslang/MachineIndependent/Scan.o \ +glslang/glslang/MachineIndependent/ShaderLang.o \ +glslang/glslang/MachineIndependent/SymbolTable.o \ +glslang/glslang/MachineIndependent/Versions.o \ +glslang/glslang/MachineIndependent/preprocessor/Pp.o \ +glslang/glslang/MachineIndependent/preprocessor/PpAtom.o \ +glslang/glslang/MachineIndependent/preprocessor/PpContext.o \ +glslang/glslang/MachineIndependent/preprocessor/PpMemory.o \ +glslang/glslang/MachineIndependent/preprocessor/PpScanner.o \ +glslang/glslang/MachineIndependent/preprocessor/PpSymbols.o \ +glslang/glslang/MachineIndependent/preprocessor/PpTokens.o \ +glslang/glslang/OSDependent/Linux/ossource.o + +OBJECTS=spirv_common.o \ +spirv_compile.o \ +spirv_disassemble.o \ +$(GLSLANG_OBJECTS) + +.PHONY: all +all: rdoc_spirv.a + +# glslang needs -Wno-error added :( +GLSLANG_OBJDIR_OBJECTS=$(addprefix $(OBJDIR)/, $(GLSLANG_OBJECTS)) + +$(GLSLANG_OBJDIR_OBJECTS): CPPFLAGS += -Wno-error + +$(OBJDIR)/%.o: %.cpp + @mkdir -p $$(dirname $@) + $(CPP) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + @$(CPP) $(CFLAGS) $(CPPFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d + +$(OBJDIR)/%.o: %.c + @mkdir -p $$(dirname $@) + $(CC) $(CFLAGS) -c -o $@ $< + @$(CC) $(CFLAGS) -MM -MT $(OBJDIR)/$*.o $< > $(OBJDIR)/$*.d + +OBJDIR_OBJECTS=$(addprefix $(OBJDIR)/, $(OBJECTS)) + +-include $(OBJDIR_OBJECTS:.o=.d) + +rdoc_spirv.a: $(OBJDIR_OBJECTS) + ar rcs rdoc_spirv.a $(OBJDIR_OBJECTS) + +.PHONY: clean +clean: + rm -rf rdoc_spirv.a $(OBJDIR) diff --git a/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj b/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj new file mode 100644 index 000000000..a75b7570b --- /dev/null +++ b/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj @@ -0,0 +1,266 @@ + + + + + Profile + Win32 + + + Profile + x64 + + + Release + Win32 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {0AAE0AD1-371B-4A36-9ED1-80E10E960605} + Win32Proj + renderdoc_spirv + spirv + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(ProjectName) + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) + $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(ProgramFiles)\Windows Kits\8.1\bin;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(ProjectName) + + + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(ProgramFiles)\Windows Kits\8.1\bin;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x64;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(ProjectName) + + + $(ProgramFiles)\Windows Kits\8.1\bin\x86;$(ExecutablePath) + $(ProgramFiles)\Windows Kits\8.1\Debuggers\inc;$(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(VSInstallDir)\DIA SDK\include;$(SolutionDir)\breakpad;$(IncludePath) + $(ProgramFiles)\Windows Kits\8.1\lib\win8\um\x86;$(LibraryPath) + $(ProgramFiles)\Windows Kits\8.1\Include\um;$(ProgramFiles)\Windows Kits\8.1\Include\shared;$(ExcludePath) + $(SolutionDir)$(Platform)\$(Configuration)\ + $(Platform)\$(Configuration)\ + $(ProjectName) + + + + + + Level3 + Disabled + RENDERDOC_EXPORTS;RENDERDOC_PLATFORM=win32;WIN64;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + $(SolutionDir)renderdoc\;$(SolutionDir)renderdoc\3rdparty\ + MultiThreadedDLL + + + Windows + true + + + + + NotUsing + Level3 + Disabled + RENDERDOC_EXPORTS;RENDERDOC_PLATFORM=win32;WIN64;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + $(SolutionDir)renderdoc\;$(SolutionDir)renderdoc\3rdparty\ + false + MultiThreadedDLL + + + Windows + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + RENDERDOC_EXPORTS;RENDERDOC_PLATFORM=win32;WIN64;WIN32;RELEASE;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + $(SolutionDir)renderdoc\;$(SolutionDir)renderdoc\3rdparty\ + false + MultiThreadedDLL + + + Windows + true + true + true + + + + + Level3 + NotUsing + MaxSpeed + true + true + RENDERDOC_EXPORTS;RENDERDOC_PLATFORM=win32;USE_BREAKPAD;WIN64;WIN32;RELEASE;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + $(SolutionDir)renderdoc\;$(SolutionDir)renderdoc\3rdparty\ + false + MultiThreadedDLL + + + Windows + true + true + true + + + + + $(SolutionDir)renderdoc\;$(SolutionDir)renderdoc\3rdparty\ + RENDERDOC_EXPORTS;RENDERDOC_PLATFORM=win32;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + false + NotUsing + + + + + + \ No newline at end of file diff --git a/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj.filters b/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj.filters new file mode 100644 index 000000000..da97e7d05 --- /dev/null +++ b/renderdoc/driver/shaders/spirv/renderdoc_spirv.vcxproj.filters @@ -0,0 +1,220 @@ + + + + + {4aaae50a-4e0a-40b2-964d-5bfeae6f287f} + + + {e27da9c0-fc84-4bda-a7ed-f0d6a6e1e214} + + + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + + + + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + 3rdparty\glslang + + + + \ No newline at end of file diff --git a/renderdoc/driver/shaders/spirv/spirv_common.cpp b/renderdoc/driver/shaders/spirv/spirv_common.cpp new file mode 100644 index 000000000..acf2d6323 --- /dev/null +++ b/renderdoc/driver/shaders/spirv/spirv_common.cpp @@ -0,0 +1,49 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2015 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "spirv_common.h" + +#undef min +#undef max + +#include "3rdparty/glslang/glslang/Public/ShaderLang.h" + +static bool inited = false; + +void InitSPIRVCompiler() +{ + if(!inited) + { + glslang::InitializeProcess(); + inited = true; + } +} + +void ShutdownSPIRVCompiler() +{ + if(inited) + { + glslang::FinalizeProcess(); + } +} diff --git a/renderdoc/driver/shaders/spirv/spirv_common.h b/renderdoc/driver/shaders/spirv/spirv_common.h new file mode 100644 index 000000000..19d00e865 --- /dev/null +++ b/renderdoc/driver/shaders/spirv/spirv_common.h @@ -0,0 +1,47 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2015 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include +#include +using std::string; +using std::vector; + +#include + +enum SPIRVShaderStage +{ + eSPIRVVertex, + eSPIRVTessControl, + eSPIRVTessEvaluation, + eSPIRVGeometry, + eSPIRVFragment, + eSPIRVCompute, + eSPIRVInvalid, +}; + +void InitSPIRVCompiler(); +void ShutdownSPIRVCompiler(); + +string CompileSPIRV(SPIRVShaderStage shadType, const vector &sources, vector &spirv); +void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, string &disasm); diff --git a/renderdoc/driver/shaders/spirv/spirv_compile.cpp b/renderdoc/driver/shaders/spirv/spirv_compile.cpp new file mode 100644 index 000000000..4acd610f2 --- /dev/null +++ b/renderdoc/driver/shaders/spirv/spirv_compile.cpp @@ -0,0 +1,205 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2015 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "common/common.h" + +#include "spirv_common.h" + +#undef min +#undef max + +#include "3rdparty/glslang/SPIRV/GlslangToSpv.h" +#include "3rdparty/glslang/glslang/Public/ShaderLang.h" + +TBuiltInResource DefaultResources = +{ + /*.maxLights =*/ 32, + /*.maxClipPlanes =*/ 6, + /*.maxTextureUnits =*/ 32, + /*.maxTextureCoords =*/ 32, + /*.maxVertexAttribs =*/ 64, + /*.maxVertexUniformComponents =*/ 4096, + /*.maxVaryingFloats =*/ 64, + /*.maxVertexTextureImageUnits =*/ 32, + /*.maxCombinedTextureImageUnits =*/ 80, + /*.maxTextureImageUnits =*/ 32, + /*.maxFragmentUniformComponents =*/ 4096, + /*.maxDrawBuffers =*/ 32, + /*.maxVertexUniformVectors =*/ 128, + /*.maxVaryingVectors =*/ 8, + /*.maxFragmentUniformVectors =*/ 16, + /*.maxVertexOutputVectors =*/ 16, + /*.maxFragmentInputVectors =*/ 15, + /*.minProgramTexelOffset =*/ -8, + /*.maxProgramTexelOffset =*/ 7, + /*.maxClipDistances =*/ 8, + /*.maxComputeWorkGroupCountX =*/ 65535, + /*.maxComputeWorkGroupCountY =*/ 65535, + /*.maxComputeWorkGroupCountZ =*/ 65535, + /*.maxComputeWorkGroupSizeX =*/ 1024, + /*.maxComputeWorkGroupSizeY =*/ 1024, + /*.maxComputeWorkGroupSizeZ =*/ 64, + /*.maxComputeUniformComponents =*/ 1024, + /*.maxComputeTextureImageUnits =*/ 16, + /*.maxComputeImageUniforms =*/ 8, + /*.maxComputeAtomicCounters =*/ 8, + /*.maxComputeAtomicCounterBuffers =*/ 1, + /*.maxVaryingComponents =*/ 60, + /*.maxVertexOutputComponents =*/ 64, + /*.maxGeometryInputComponents =*/ 64, + /*.maxGeometryOutputComponents =*/ 128, + /*.maxFragmentInputComponents =*/ 128, + /*.maxImageUnits =*/ 8, + /*.maxCombinedImageUnitsAndFragmentOutputs =*/ 8, + /*.maxCombinedShaderOutputResources =*/ 8, + /*.maxImageSamples =*/ 0, + /*.maxVertexImageUniforms =*/ 0, + /*.maxTessControlImageUniforms =*/ 0, + /*.maxTessEvaluationImageUniforms =*/ 0, + /*.maxGeometryImageUniforms =*/ 0, + /*.maxFragmentImageUniforms =*/ 8, + /*.maxCombinedImageUniforms =*/ 8, + /*.maxGeometryTextureImageUnits =*/ 16, + /*.maxGeometryOutputVertices =*/ 256, + /*.maxGeometryTotalOutputComponents =*/ 1024, + /*.maxGeometryUniformComponents =*/ 1024, + /*.maxGeometryVaryingComponents =*/ 64, + /*.maxTessControlInputComponents =*/ 128, + /*.maxTessControlOutputComponents =*/ 128, + /*.maxTessControlTextureImageUnits =*/ 16, + /*.maxTessControlUniformComponents =*/ 1024, + /*.maxTessControlTotalOutputComponents =*/ 4096, + /*.maxTessEvaluationInputComponents =*/ 128, + /*.maxTessEvaluationOutputComponents =*/ 128, + /*.maxTessEvaluationTextureImageUnits =*/ 16, + /*.maxTessEvaluationUniformComponents =*/ 1024, + /*.maxTessPatchComponents =*/ 120, + /*.maxPatchVertices =*/ 32, + /*.maxTessGenLevel =*/ 64, + /*.maxViewports =*/ 16, + /*.maxVertexAtomicCounters =*/ 0, + /*.maxTessControlAtomicCounters =*/ 0, + /*.maxTessEvaluationAtomicCounters =*/ 0, + /*.maxGeometryAtomicCounters =*/ 0, + /*.maxFragmentAtomicCounters =*/ 8, + /*.maxCombinedAtomicCounters =*/ 8, + /*.maxAtomicCounterBindings =*/ 1, + /*.maxVertexAtomicCounterBuffers =*/ 0, + /*.maxTessControlAtomicCounterBuffers =*/ 0, + /*.maxTessEvaluationAtomicCounterBuffers =*/ 0, + /*.maxGeometryAtomicCounterBuffers =*/ 0, + /*.maxFragmentAtomicCounterBuffers =*/ 1, + /*.maxCombinedAtomicCounterBuffers =*/ 1, + /*.maxAtomicCounterBufferSize =*/ 16384, + /*.maxTransformFeedbackBuffers =*/ 4, + /*.maxTransformFeedbackInterleavedComponents =*/ 64, + /*.maxCullDistances =*/ 8, + /*.maxCombinedClipAndCullDistances =*/ 8, + /*.maxSamples =*/ 4, + + /*.limits*/ + { + /*.limits.nonInductiveForLoops =*/ 1, + /*.limits.whileLoops =*/ 1, + /*.limits.doWhileLoops =*/ 1, + /*.limits.generalUniformIndexing =*/ 1, + /*.limits.generalAttributeMatrixVectorIndexing =*/ 1, + /*.limits.generalVaryingIndexing =*/ 1, + /*.limits.generalSamplerIndexing =*/ 1, + /*.limits.generalVariableIndexing =*/ 1, + /*.limits.generalConstantMatrixVectorIndexing =*/ 1, + }, +}; + +string CompileSPIRV(SPIRVShaderStage shadType, const std::vector &sources, vector &spirv) +{ + if(shadType >= eSPIRVInvalid) + return "Invalid shader stage specified"; + + string errors = ""; + + const char **strs = new const char *[sources.size()]; + + for(size_t i=0; i < sources.size(); i++) + strs[i] = sources[i].c_str(); + + RDCCOMPILE_ASSERT( + (int)EShLangVertex == (int)eSPIRVVertex && + (int)EShLangTessControl == (int)eSPIRVTessControl && + (int)EShLangTessEvaluation == (int)eSPIRVTessEvaluation && + (int)EShLangGeometry == (int)eSPIRVGeometry && + (int)EShLangCompute == (int)eSPIRVCompute, + "Shader language enums don't match"); + + { + EShLanguage lang = EShLanguage(shadType); + + glslang::TShader *shader = new glslang::TShader(lang); + + shader->setStrings(strs, (int)sources.size()); + + bool success = shader->parse(&DefaultResources, 110, false, EShMsgDefault); + + if(!success) + { + errors = "Shader failed to compile:\n\n"; + errors += shader->getInfoLog(); + errors += "\n\n"; + errors += shader->getInfoDebugLog(); + } + else + { + glslang::TProgram *program = new glslang::TProgram(); + + program->addShader(shader); + + success = program->link(EShMsgDefault); + + if(!success) + { + errors = "Program failed to link:\n\n"; + errors += program->getInfoLog(); + errors += "\n\n"; + errors += program->getInfoDebugLog(); + } + else + { + glslang::TIntermediate *intermediate = program->getIntermediate(lang); + + // if we successfully compiled and linked, we must have the stage we started with + RDCASSERT(intermediate); + + glslang::GlslangToSpv(*intermediate, spirv); + } + + delete program; + } + + delete shader; + } + + delete[] strs; + + return errors; +} diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp new file mode 100644 index 000000000..eb71924bc --- /dev/null +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -0,0 +1,55 @@ +/****************************************************************************** + * The MIT License (MIT) + * + * Copyright (c) 2015 Baldur Karlsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + ******************************************************************************/ + +#include "common/common.h" + +#include "spirv_common.h" + +#undef min +#undef max + +#include "3rdparty/glslang/SPIRV/GlslangToSpv.h" +#include "3rdparty/glslang/glslang/Public/ShaderLang.h" + +void DisassembleSPIRV(SPIRVShaderStage shadType, const vector &spirv, string &disasm) +{ + if(shadType >= eSPIRVInvalid) + return; + + // temporary function until we build our own structure from the SPIR-V + const char *header[] = { + "Vertex Shader", + "Tessellation Control Shader", + "Tessellation Evaluation Shader", + "Geometry Shader", + "Fragment Shader", + "Compute Shader", + }; + + disasm = header[(int)shadType]; + disasm += " SPIR-V raw stream:\n\n"; + + for(size_t i=0; i < spirv.size(); i++) + disasm += StringFormat::Fmt(" %08x\n", spirv[i]); +} diff --git a/renderdoc/renderdoc.vcxproj b/renderdoc/renderdoc.vcxproj index 1ae06e8df..8e4b4cbf1 100644 --- a/renderdoc/renderdoc.vcxproj +++ b/renderdoc/renderdoc.vcxproj @@ -220,38 +220,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -303,37 +271,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/renderdoc/renderdoc.vcxproj.filters b/renderdoc/renderdoc.vcxproj.filters index fff973f0d..90b83a128 100644 --- a/renderdoc/renderdoc.vcxproj.filters +++ b/renderdoc/renderdoc.vcxproj.filters @@ -70,9 +70,6 @@ {3e51a921-b167-4794-937d-e77573a928b8} - - {cec343f1-e0e5-4168-8f0a-57314338c6c6} - @@ -222,102 +219,6 @@ Resources - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - @@ -440,99 +341,6 @@ OS\Win32 - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - - - 3rdparty\glslang - diff --git a/renderdoccmd/Makefile b/renderdoccmd/Makefile index b1fd1c982..0f7ceff8c 100644 --- a/renderdoccmd/Makefile +++ b/renderdoccmd/Makefile @@ -34,4 +34,4 @@ bin/renderdoccmd: $(OBJDIR_OBJECTS) ../renderdoc/librenderdoc.so .PHONY: clean clean: - rm -rf bin/renderdoccmd $(OBJDIR) + rm -rf bin/ $(OBJDIR)