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); } }
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; }