void GenerateDepalShader(char *buffer, GEBufferFormat pixelFormat, ShaderLanguage language) {
	switch (language) {
	case GLSL_140:
		GenerateDepalShaderFloat(buffer, pixelFormat, language);
		break;
	case GLSL_300:
		GenerateDepalShader300(buffer, pixelFormat);
		break;
	case HLSL_DX9:
		GenerateDepalShaderFloat(buffer, pixelFormat, language);
		break;
	}
}
void GenerateDepalShader(char *buffer, GEBufferFormat pixelFormat, ShaderLanguage language) {
	switch (language) {
	case GLSL_140:
		GenerateDepalShaderFloat(buffer, pixelFormat, language);
		break;
	case GLSL_300:
	case GLSL_VULKAN:
	case HLSL_D3D11:
		GenerateDepalShader300(buffer, pixelFormat, language);
		break;
	case HLSL_DX9:
		GenerateDepalShaderFloat(buffer, pixelFormat, language);
		break;
	case HLSL_D3D11_LEVEL9:
	default:
		_assert_msg_(G3D, false, "Depal shader language not supported: %d", (int)language);
	}
}
Beispiel #3
0
GLuint DepalShaderCache::GetDepalettizeShader(GEBufferFormat pixelFormat) {
	u32 id = GenerateShaderID(pixelFormat);

	bool useGL3 = gl_extensions.GLES3 || gl_extensions.VersionGEThan(3, 3);

	auto shader = cache_.find(id);
	if (shader != cache_.end()) {
		return shader->second->program;
	}

	char *buffer = new char[2048];

	if (useGL3) {
		GenerateDepalShader300(buffer, pixelFormat);
	} else {
		GenerateDepalShader100(buffer, pixelFormat);
	}

	GLuint fragShader = glCreateShader(GL_FRAGMENT_SHADER);

	const char *buf = buffer;
	glShaderSource(fragShader, 1, &buf, 0);
	glCompileShader(fragShader);

	CheckShaderCompileSuccess(fragShader, buffer);

	GLuint program = glCreateProgram();
	glAttachShader(program, vertexShader_);
	glAttachShader(program, fragShader);
	
	glBindAttribLocation(program, 0, "a_position");
	glBindAttribLocation(program, 1, "a_texcoord0");

	if (useGL3) {
		// This call is not really necessary, I think.
#ifndef MOBILE_DEVICE
		glBindFragDataLocation(program, 0, "fragColor0");
#endif
	}

	glLinkProgram(program);
	glUseProgram(program);

	GLint u_tex = glGetUniformLocation(program, "tex");
	GLint u_pal = glGetUniformLocation(program, "pal");

	glUniform1i(u_tex, 0);
	glUniform1i(u_pal, 1);

	GLint linkStatus = GL_FALSE;
	glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
	if (linkStatus != GL_TRUE) {
		GLint bufLength = 0;
		glGetProgramiv(program, GL_INFO_LOG_LENGTH, &bufLength);
		if (bufLength) {
			char* errorbuf = new char[bufLength];
			glGetProgramInfoLog(program, bufLength, NULL, errorbuf);
#ifdef SHADERLOG
			OutputDebugStringUTF8(buffer);
			OutputDebugStringUTF8(errorbuf);
#endif
			ERROR_LOG(G3D, "Could not link program:\n %s  \n\n %s", errorbuf, buf);
			delete[] errorbuf;	// we're dead!
		}

		delete[] buffer;
		return 0;
	}

	DepalShader *depal = new DepalShader();
	depal->program = program;
	depal->fragShader = fragShader;

	cache_[id] = depal;

	delete[] buffer;

	return depal->program;
}