Просмотр исходного кода

Patching GL shaders to avoid compiler warnings.

Branimir Karadžić 10 лет назад
Родитель
Сommit
5d22798482
1 измененных файлов с 43 добавлено и 1 удалено
  1. 43 1
      src/renderer_gl.cpp

+ 43 - 1
src/renderer_gl.cpp

@@ -4337,7 +4337,10 @@ namespace bgfx { namespace gl
 
 					bool usesIUsamplers = !!bx::findIdentifierMatch(code, s_uisamplers);
 
-					uint32_t version = usesIUsamplers ? 130 : (usesTextureLod ? 120 : 0);
+					uint32_t version = usesIUsamplers 
+						? 130 
+						: (usesTextureLod ? 120 : 0)
+						;
 
 					if (0 != version)
 					{
@@ -4352,6 +4355,44 @@ namespace bgfx { namespace gl
 						}
 					}
 
+					if (130 <= version)
+					{
+						if (m_type == GL_FRAGMENT_SHADER)
+						{
+							writeString(&writer, "#define varying in\n");
+						}
+						else
+						{
+							writeString(&writer, "#define attribute in\n");
+							writeString(&writer, "#define varying out\n");
+						}
+
+						uint32_t fragData = 0;
+
+						if (!!bx::findIdentifierMatch(code, "gl_FragData") )
+						{
+							for (uint32_t ii = 0, num = g_caps.maxFBAttachments; ii < num; ++ii)
+							{
+								char tmpFragData[16];
+								bx::snprintf(tmpFragData, BX_COUNTOF(tmpFragData), "gl_FragData[%d]", ii);
+								fragData = bx::uint32_max(fragData, NULL == strstr(code, tmpFragData) ? 0 : ii+1);
+							}
+
+							BGFX_FATAL(0 != fragData, Fatal::InvalidShader, "Unable to find and patch gl_FragData!");
+						}
+
+						if (0 != fragData)
+						{
+							writeStringf(&writer, "out vec4 bgfx_FragData[%d];\n", fragData);
+							writeString(&writer, "#define gl_FragData bgfx_FragData\n");
+						}
+						else
+						{
+							writeString(&writer, "out vec4 bgfx_FragColor;\n");
+							writeString(&writer, "#define gl_FragColor bgfx_FragColor\n");
+						}
+					}
+
 					writeString(&writer
 							, "#define lowp\n"
 							  "#define mediump\n"
@@ -4462,6 +4503,7 @@ namespace bgfx { namespace gl
 				code = temp;
 			}
 
+BX_TRACE("%s", code);
 			GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&code, NULL) );
 			GL_CHECK(glCompileShader(m_id) );