Пример #1
0
GLuint LoadCompileAndLinkShaders(char *vs, char *fs){
	// Compile Vertex Shader
	LoadCode(vs, 0);
	LoadCode(fs, 1);

	return CompileAndLinkShaders(&shader_code[0][0], &shader_code[1][0]);
}
Пример #2
0
int C_DECL main(int argc, char* argv[])
{
    ProcessArguments(argc, argv);

    if (Options & EOptionDumpConfig) {
        printf("%s", DefaultConfig);
        if (Worklist.empty())
            return ESuccess;
    }

    if (Options & EOptionDumpVersions) {
        printf("Glslang Version: %s %s\n", GLSLANG_REVISION, GLSLANG_DATE);
        printf("ESSL Version: %s\n", glslang::GetEsslVersionString());
        printf("GLSL Version: %s\n", glslang::GetGlslVersionString());
        std::string spirvVersion;
        glslang::GetSpirvVersion(spirvVersion);
        printf("SPIR-V Version %s\n", spirvVersion.c_str());
        printf("GLSL.std.450 Version %d, Revision %d\n", GLSLstd450Version, GLSLstd450Revision);
        if (Worklist.empty())
            return ESuccess;
    }

    if (Worklist.empty()) {
        usage();
    }

    ProcessConfigFile();

    //
    // Two modes:
    // 1) linking all arguments together, single-threaded, new C++ interface
    // 2) independent arguments, can be tackled by multiple asynchronous threads, for testing thread safety, using the old handle interface
    //
    if (Options & EOptionLinkProgram ||
        Options & EOptionOutputPreprocessed) {
        glslang::InitializeProcess();
        CompileAndLinkShaders();
        glslang::FinalizeProcess();
    } else {
        ShInitialize();

        bool printShaderNames = Worklist.size() > 1;

        if (Options & EOptionMultiThreaded) {
            const int NumThreads = 16;
            void* threads[NumThreads];
            for (int t = 0; t < NumThreads; ++t) {
                threads[t] = glslang::OS_CreateThread(&CompileShaders);
                if (! threads[t]) {
                    printf("Failed to create thread\n");
                    return EFailThreadCreate;
                }
            }
            glslang::OS_WaitForAllThreads(threads, NumThreads);
        } else
            CompileShaders(0);

        // Print out all the resulting infologs
        for (int w = 0; w < NumWorkItems; ++w) {
            if (Work[w]) {
                if (printShaderNames)
                    PutsIfNonEmpty(Work[w]->name.c_str());
                PutsIfNonEmpty(Work[w]->results.c_str());
                delete Work[w];
            }
        }

        ShFinalize();
    }

    if (CompileFailed)
        return EFailCompile;
    if (LinkFailed)
        return EFailLink;

    return 0;
}
Пример #3
0
int C_DECL main(int argc, char* argv[]) {
	if (argc < 6) {
		usage();
		return 1;
	}

	const char* tempdir = argv[4];
	
	//Options |= EOptionHumanReadableSpv;
	Options |= EOptionSpv;
	Options |= EOptionLinkProgram;
	//Options |= EOptionSuppressInfolog;

	NumWorkItems = 1;
	Work = new glslang::TWorkItem*[NumWorkItems];
	Work[0] = 0;

	std::string name(argv[2]);
	if (!SetConfigFile(name)) {
		Work[0] = new glslang::TWorkItem(name);
		Worklist.add(Work[0]);
	}

	ProcessConfigFile();

	glslang::InitializeProcess();
	
	KrafixIncluder includer(name);
	krafix::Target target;
	target.system = getSystem(argv[5]);
	target.es = false;
	if (strcmp(argv[1], "d3d9") == 0) {
		target.lang = krafix::HLSL;
		target.version = 9;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "d3d11") == 0) {
		target.lang = krafix::HLSL;
		target.version = 11;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "glsl") == 0) {
		target.lang = krafix::GLSL;
		if (target.system == krafix::Linux) target.version = 100;
		else target.version = 330;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "essl") == 0) {
		target.lang = krafix::GLSL;
		target.version = 100;
		target.es = true;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "agal") == 0) {
		target.lang = krafix::AGAL;
		target.version = 100;
		target.es = true;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "metal") == 0) {
		target.lang = krafix::Metal;
		target.version = 1;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else if (strcmp(argv[1], "varlist") == 0) {
		target.lang = krafix::VarList;
		target.version = 1;
		CompileAndLinkShaders(target, argv[3], tempdir, includer);
	}
	else {
		std::cout << "Unknown profile " << argv[1] << std::endl;
		CompileFailed = true;
	}

	glslang::FinalizeProcess();

	if (CompileFailed)
		return EFailCompile;
	if (LinkFailed)
		return EFailLink;

	return 0;
}