summaryrefslogtreecommitdiffstats
path: root/HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp')
-rw-r--r--HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp b/HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp
new file mode 100644
index 0000000..1c6614e
--- /dev/null
+++ b/HLSL2GLSLConverter/src/HLSL2GLSLConverterApp.cpp
@@ -0,0 +1,246 @@
+// HLSL2GLSLConverterImpl.cpp : Defines the entry point for the console application.
+//
+
+#include <Windows.h>
+#include "Errors.h"
+#include "HLSL2GLSLConverterImpl.h"
+#include "RefCntAutoPtr.h"
+#include "Errors.h"
+#include "RenderDeviceFactoryOpenGL.h"
+#include "BasicShaderSourceStreamFactory.h"
+#include "RefCntAutoPtr.h"
+#include "DataBlobImpl.h"
+
+using namespace Diligent;
+
+// Called every time the application receives a message
+LRESULT CALLBACK MessageProc(HWND wnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ // Send event message to AntTweakBar
+ switch (message)
+ {
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+ BeginPaint(wnd, &ps);
+ EndPaint(wnd, &ps);
+ return 0;
+ }
+ case WM_SIZE: // Window size has been changed
+ return 0;
+ case WM_CHAR:
+ if (wParam == VK_ESCAPE)
+ PostQuitMessage(0);
+ return 0;
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ default:
+ return DefWindowProc(wnd, message, wParam, lParam);
+ }
+}
+
+void PrintHelp()
+{
+ LOG_INFO_MESSAGE("Command line arguments:\n")
+ LOG_INFO_MESSAGE("-h Print help message\n")
+ LOG_INFO_MESSAGE("-i <filename> Input file path (relative to the search directories)\n")
+ LOG_INFO_MESSAGE("-d <dirname> Search directory to look for input file path as well as all #include files")
+ LOG_INFO_MESSAGE(" Every search directory should be specified using -d argument\n")
+ LOG_INFO_MESSAGE("-o <filename> Output file to write converted GLSL source to\n")
+ LOG_INFO_MESSAGE("-e <funcname> Shader entry point\n")
+ LOG_INFO_MESSAGE("-c Compile converted GLSL shader\n")
+ LOG_INFO_MESSAGE("-t <type> Shader type. Allowed values:")
+ LOG_INFO_MESSAGE(" vs - vertex shader")
+ LOG_INFO_MESSAGE(" ps - pixel shader")
+ LOG_INFO_MESSAGE(" gs - geometry shader")
+ LOG_INFO_MESSAGE(" ds - domain shader")
+ LOG_INFO_MESSAGE(" hs - domain shader")
+ LOG_INFO_MESSAGE(" cs - domain shader\n")
+ LOG_INFO_MESSAGE("-noglsldef Do not include glsl definitions into the converted source\n")
+}
+
+// Main
+int main(int argc, char** argv)
+{
+#if defined(_DEBUG) || defined(DEBUG)
+ _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
+#endif
+
+ if (argc == 1)
+ {
+ PrintHelp();
+ return 0;
+ }
+
+ std::string InputPath, OutputPath, SearchDirectories, EntryPoint("main");
+ SHADER_TYPE ShaderType = SHADER_TYPE_UNKNOWN;
+ bool CompileShader = false;
+ bool IncludeGLSLDefintions = true;
+ for (int a = 1; a < argc; ++a) {
+ if (_stricmp(argv[a], "-h") == 0)
+ {
+ PrintHelp();
+ }
+ else if (_stricmp(argv[a], "-i") == 0 && a + 1 < argc)
+ {
+ InputPath = argv[++a];
+ }
+ else if (_stricmp(argv[a], "-o") == 0 && a + 1 < argc)
+ {
+ OutputPath = argv[++a];
+ }
+ else if (_stricmp(argv[a], "-d") == 0 && a + 1 < argc)
+ {
+ if(!SearchDirectories.empty())
+ SearchDirectories.push_back(';');
+ SearchDirectories += argv[++a];
+ }
+ else if (_stricmp(argv[a], "-e") == 0 && a + 1 < argc)
+ {
+ EntryPoint = argv[++a];
+ }
+ else if (_stricmp(argv[a], "-c") == 0)
+ {
+ CompileShader = true;
+ }
+ else if (_stricmp(argv[a], "-t") == 0 && a + 1 < argc)
+ {
+ ++a;
+ if (_stricmp(argv[a], "vs")==0)ShaderType = SHADER_TYPE_VERTEX;
+ else if (_stricmp(argv[a], "gs")==0)ShaderType = SHADER_TYPE_GEOMETRY;
+ else if (_stricmp(argv[a], "ps")==0)ShaderType = SHADER_TYPE_PIXEL;
+ else if (_stricmp(argv[a], "hs")==0)ShaderType = SHADER_TYPE_HULL;
+ else if (_stricmp(argv[a], "ds")==0)ShaderType = SHADER_TYPE_DOMAIN;
+ else if (_stricmp(argv[a], "cs")==0)ShaderType = SHADER_TYPE_COMPUTE;
+ else
+ {
+ LOG_ERROR_MESSAGE("Unknow shader type ", argv[a],"; Allowed values: vs,gs,ps,ds,hs,cs");
+ return -1;
+ }
+ }
+ else if (_stricmp(argv[a], "-noglsldef") == 0)
+ {
+ IncludeGLSLDefintions = false;
+ }
+ else
+ {
+ LOG_ERROR_MESSAGE("Unknow command line option ", argv[a]);
+ return -1;
+ }
+ }
+
+ if (InputPath.length() == 0)
+ {
+ LOG_ERROR_MESSAGE("Input file path not specified; use -i command line option");
+ return -1;
+ }
+
+ if(ShaderType == SHADER_TYPE_UNKNOWN)
+ {
+ LOG_ERROR_MESSAGE("Shader type not specified; use -t [vs;ps;gs;ds;hs;cs] command line option");
+ return -1;
+ }
+
+ LOG_INFO_MESSAGE("Converting \'", InputPath, "\' to GLSL...")
+
+#ifdef ENGINE_DLL
+ // Declare function pointer
+ GetEngineFactoryOpenGLType GetEngineFactoryOpenGL = nullptr;
+ if( !LoadGraphicsEngineOpenGL(GetEngineFactoryOpenGL) )
+ {
+ LOG_ERROR_MESSAGE("Failed to load OpenGL engine implementation");
+ return -1;
+ }
+#endif
+ IEngineFactoryOpenGL *pFactory = GetEngineFactoryOpenGL();
+
+ BasicShaderSourceStreamFactory BasicSSSFactory(SearchDirectories.c_str());
+ RefCntAutoPtr<IFileStream> pInputFileStream;
+ BasicSSSFactory.CreateInputStream(InputPath.c_str(), &pInputFileStream);
+ if (!pInputFileStream)
+ {
+ return -1;
+ }
+ RefCntAutoPtr<Diligent::IDataBlob> pHLSLSourceBlob( MakeNewRCObj<DataBlobImpl>()(0) );
+ pInputFileStream->Read(pHLSLSourceBlob);
+ auto *HLSLSource = reinterpret_cast<char*>(pHLSLSourceBlob->GetDataPtr());
+ auto SourceLen = static_cast<Int32>( pHLSLSourceBlob->GetSize() );
+
+ const auto &Converter = HLSL2GLSLConverterImpl::GetInstance();
+ RefCntAutoPtr<IHLSL2GLSLConversionStream> pStream;
+ Converter.CreateStream(InputPath.c_str(), &BasicSSSFactory, HLSLSource, SourceLen, &pStream);
+ RefCntAutoPtr<Diligent::IDataBlob> pGLSLSourceBlob;
+ pStream->Convert(EntryPoint.c_str(), ShaderType, IncludeGLSLDefintions, &pGLSLSourceBlob);
+ if(!pGLSLSourceBlob)return -1;
+
+ LOG_INFO_MESSAGE("Done")
+
+ if (OutputPath.length() != 0)
+ {
+ FileWrapper pOutputFile( OutputPath.c_str(), EFileAccessMode::Overwrite );
+ if (pOutputFile != nullptr)
+ {
+ if( !pOutputFile->Write(pGLSLSourceBlob->GetDataPtr(), pGLSLSourceBlob->GetSize()) )
+ {
+ LOG_ERROR_MESSAGE("Failed to write converted source to output file ", OutputPath);
+ }
+ }
+ else
+ {
+ LOG_ERROR_MESSAGE("Failed to open output file ", OutputPath);
+ }
+ }
+
+ if(CompileShader)
+ {
+ LOG_INFO_MESSAGE("Compiling entry point \'", EntryPoint, "\' in converted file \'", InputPath, '\'')
+ // Register window cla ss
+ WNDCLASSEX wcex = { sizeof(WNDCLASSEX), CS_HREDRAW|CS_VREDRAW, MessageProc,
+ 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"HLSL2GLSLConverter", NULL };
+ RegisterClassEx(&wcex);
+
+ // Create dummy window
+ RECT rc = { 0, 0, 512, 512 };
+ AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE);
+ HWND wnd = CreateWindow(L"HLSL2GLSLConverter", L"HLSL2GLSL Converter",
+ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
+ rc.right-rc.left, rc.bottom-rc.top, NULL, NULL, wcex.hInstance, NULL);
+
+ if (!wnd)
+ {
+ LOG_ERROR_MESSAGE("Failed to create window");
+ return -1;
+ }
+ RefCntAutoPtr<IRenderDevice> pDevice;
+ RefCntAutoPtr<IDeviceContext> pContext;
+ RefCntAutoPtr<ISwapChain> pSwapChain;
+ EngineCreationAttribs EngineCreationAttribs;
+ SwapChainDesc SCDesc;
+ SCDesc.SamplesCount = 1;
+ pFactory->CreateDeviceAndSwapChainGL(
+ EngineCreationAttribs, &pDevice, &pContext, SCDesc, wnd, &pSwapChain );
+ if (!pDevice)
+ {
+ LOG_ERROR_MESSAGE("Failed to create render device");
+ return -1;
+ }
+
+ ShaderCreationAttribs Attrs;
+ Attrs.EntryPoint = EntryPoint.c_str();
+ Attrs.Desc.ShaderType = ShaderType;
+ Attrs.Desc.Name = "Test shader";
+ Attrs.Source = reinterpret_cast<char*>(pGLSLSourceBlob->GetDataPtr());
+ Attrs.SourceLanguage = SHADER_SOURCE_LANGUAGE_GLSL;
+ RefCntAutoPtr<IShader> pTestShader;
+ pDevice->CreateShader(Attrs, &pTestShader);
+ if(!pTestShader)
+ {
+ LOG_ERROR_MESSAGE("Failed to compile converted source \'", InputPath, '\'');
+ return -1;
+ }
+ LOG_INFO_MESSAGE("Done")
+ }
+
+ return 0;
+}