| <html> |
| <head> |
| <script src="../../../resources/js-test.js"></script> |
| <script src="resources/webgl-test.js"></script> |
| </head> |
| <body> |
| <div id="description"></div> |
| <div id="console"></div> |
| |
| <script> |
| description("Tests the WebGLUniformLocation API"); |
| |
| if (window.internals) |
| window.internals.settings.setWebGLErrorsToConsoleEnabled(false); |
| |
| var contextA = create3DContext(); |
| var contextB = create3DContext(); |
| var programA1 = loadStandardProgram(contextA); |
| var programA2 = loadStandardProgram(contextA); |
| var programB = loadStandardProgram(contextB); |
| var programS = loadProgram(contextA, "resources/structUniformShader.vert", "resources/fragmentShader.frag"); |
| var programV = loadProgram(contextA, "resources/floatUniformShader.vert", "resources/noopUniformShader.frag"); |
| var locationA = contextA.getUniformLocation(programA1, 'u_modelViewProjMatrix'); |
| var locationB = contextB.getUniformLocation(programB, 'u_modelViewProjMatrix'); |
| var locationSx = contextA.getUniformLocation(programS, "u_struct.x"); |
| var locationArray0 = contextA.getUniformLocation(programS, "u_array[0]"); |
| var locationArray1 = contextA.getUniformLocation(programS, "u_array[1]"); |
| var locationVec4 = contextA.getUniformLocation(programV, "fval4"); |
| |
| var vec = [1, 2, 3, 4]; |
| var mat = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; |
| |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.useProgram(programA2)"); |
| shouldGenerateGLError(contextA, contextA.INVALID_OPERATION, "contextA.uniformMatrix4fv(locationA, false, mat)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.useProgram(programA1)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniformMatrix4fv(locationA, false, mat)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniformMatrix4fv(null, false, mat)"); |
| |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.useProgram(programS)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniform1i(locationSx, 3)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniform1f(locationArray0, 4.0)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniform1f(locationArray1, 5.0)"); |
| |
| shouldBe("contextA.getUniform(programS, locationSx)", "3"); |
| shouldBe("contextA.getUniform(programS, locationArray0)", "4.0"); |
| shouldBe("contextA.getUniform(programS, locationArray1)", "5.0"); |
| |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.useProgram(programV)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniform4fv(locationVec4, vec)"); |
| shouldBe("contextA.getUniform(programV, locationVec4)", "vec"); |
| |
| shouldBeNull("contextA.getUniformLocation(programV, \"IDontExist\")"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.linkProgram(programA1)"); |
| // After linking all boxes are bad. |
| shouldGenerateGLError(contextA, contextA.INVALID_OPERATION, "contextA.uniformMatrix4fv(locationA, false, mat)"); |
| |
| // after re-linking the same program, all uniform locations become invalid. |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.useProgram(programS)"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.linkProgram(programS)"); |
| shouldGenerateGLError(contextA, contextA.INVALID_OPERATION, "contextA.uniform1i(locationSx, 3)"); |
| shouldGenerateGLError(contextA, contextA.INVALID_OPERATION, "contextA.getUniform(programS, locationSx)"); |
| |
| // Retrieve the locations again, and they should be good. |
| locationSx = contextA.getUniformLocation(programS, "u_struct.x"); |
| locationArray0 = contextA.getUniformLocation(programS, "u_array[0]"); |
| shouldGenerateGLError(contextA, contextA.NO_ERROR, "contextA.uniform1i(locationSx, 3)"); |
| shouldBe("contextA.getUniform(programS, locationSx)", "3"); |
| </script> |
| </body> |
| </html> |