Hash :
dfefcbc6
Author :
Date :
2025-06-09T16:30:55
glGetProgramiv should return the properties in effect glProgramParameteri can set values to GL_PROGRAM_BINARY_RETRIEVABLE_HINT. However, this setting will not be in effect until the next time glLinkProgram or glProgramBinary has been called successfully. Also, glGetProgramiv returns the properties currently in effect for program. Therefore, we need to add a variable to record the ineffective value and copy it at the stage of glLinkProgram or glProgramBinary. Bug: angleproject:421219220 Change-Id: Ib564e6df03d34f3fc7389f926795cb3e64cbf687 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/6606372 Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Auto-Submit: Aurora Zhang <Aurora.Zhang@arm.com> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ProgramParameterTest: validate parameters of ProgramParameter
#include "test_utils/ANGLETest.h"
using namespace angle;
namespace
{
class ProgramParameterTest : public ANGLETest<>
{
protected:
ProgramParameterTest()
{
setWindowWidth(64);
setWindowHeight(64);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
};
class ProgramParameterTestES31 : public ProgramParameterTest
{
protected:
ProgramParameterTestES31() : ProgramParameterTest() {}
};
// If es version < 3.1, PROGRAM_SEPARABLE is not supported.
TEST_P(ProgramParameterTest, ValidatePname)
{
GLuint program = glCreateProgram();
ASSERT_NE(program, 0u);
glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
ASSERT_GL_NO_ERROR();
glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
{
ASSERT_GL_ERROR(GL_INVALID_ENUM);
}
else
{
ASSERT_GL_NO_ERROR();
}
glDeleteProgram(program);
}
// Validate parameters for ProgramParameter when pname is PROGRAM_SEPARABLE.
TEST_P(ProgramParameterTestES31, ValidateParameters)
{
GLuint program = glCreateProgram();
ASSERT_NE(program, 0u);
glProgramParameteri(0, GL_PROGRAM_SEPARABLE, GL_TRUE);
ASSERT_GL_ERROR(GL_INVALID_VALUE);
glProgramParameteri(program, GL_PROGRAM_SEPARABLE, 2);
ASSERT_GL_ERROR(GL_INVALID_VALUE);
glDeleteProgram(program);
}
// Get GL_PROGRAM_BINARY_RETRIEVABLE_HINT before glLinkProgram to
// make sure it gets the correct in effect value.
TEST_P(ProgramParameterTest, DelayRetrievableHint)
{
GLuint program = glCreateProgram();
ASSERT_NE(program, 0u);
GLuint vertexShader = CompileShader(GL_VERTEX_SHADER, essl3_shaders::vs::Simple());
GLuint fragmentShader = CompileShader(GL_FRAGMENT_SHADER, essl3_shaders::fs::Red());
ASSERT_NE(0u, vertexShader);
ASSERT_NE(0u, fragmentShader);
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
glLinkProgram(program);
GLint params;
glGetProgramiv(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, ¶ms);
ASSERT_EQ(1, params);
// False is not in effect before glLinkProgram.
glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_FALSE);
glGetProgramiv(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, ¶ms);
ASSERT_EQ(1, params);
glLinkProgram(program);
glGetProgramiv(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, ¶ms);
ASSERT_EQ(0, params);
}
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramParameterTest);
ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(ProgramParameterTest);
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(ProgramParameterTestES31);
ANGLE_INSTANTIATE_TEST_ES31(ProgramParameterTestES31);
} // namespace