Hash :
3b5b7a29
Author :
Date :
2022-07-03T00:00:00
Caps: Check if ANGLE_texture_multisample is enabled Updated RenderbufferMultisampleTest.IntegerInternalformat and adjusted getRenderbufferParameteriv validation. Bug: angleproject:7479 Change-Id: Ieaeda4e8a8c11c3d1023f40a90639f3ecfcba9bd Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3738148 Reviewed-by: Gregg Tavares <gman@chromium.org> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
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 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
//
// Copyright 2018 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.
//
// RenderbufferMultisampleTest: Tests of multisampled renderbuffer
#include "test_utils/ANGLETest.h"
#include "test_utils/gl_raii.h"
using namespace angle;
namespace
{
class RenderbufferMultisampleTest : public ANGLETest<>
{
protected:
RenderbufferMultisampleTest()
{
setWindowWidth(64);
setWindowHeight(64);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
setExtensionsEnabled(false);
}
void testSetUp() override
{
glGenRenderbuffers(1, &mRenderbuffer);
ASSERT_GL_NO_ERROR();
}
void testTearDown() override
{
glDeleteRenderbuffers(1, &mRenderbuffer);
mRenderbuffer = 0;
}
GLuint mRenderbuffer = 0;
};
// In GLES 3.0, if internalformat is integer (signed or unsigned), to allocate multisample
// renderbuffer storage for that internalformat is not supported. An INVALID_OPERATION is
// generated. In GLES 3.1, it is OK to allocate multisample renderbuffer storage for interger
// internalformat, but the max samples should be less than MAX_INTEGER_SAMPLES.
// MAX_INTEGER_SAMPLES should be at least 1.
TEST_P(RenderbufferMultisampleTest, IntegerInternalformat)
{
// Fixed in recent mesa. http://crbug.com/1071142
ANGLE_SKIP_TEST_IF(IsVulkan() && IsLinux() && (IsIntel() || IsAMD()));
glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 1, GL_RGBA8I, 64, 64);
if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
{
ASSERT_GL_ERROR(GL_INVALID_OPERATION);
// Check that NUM_SAMPLE_COUNTS is zero
GLint numSampleCounts = 0;
glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8I, GL_NUM_SAMPLE_COUNTS, 1,
&numSampleCounts);
ASSERT_GL_NO_ERROR();
EXPECT_EQ(numSampleCounts, 0);
}
else
{
ASSERT_GL_NO_ERROR();
GLint maxSamplesRGBA8I = 0;
glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8I, GL_SAMPLES, 1, &maxSamplesRGBA8I);
GLint maxIntegerSamples = 0;
glGetIntegerv(GL_MAX_INTEGER_SAMPLES, &maxIntegerSamples);
ASSERT_GL_NO_ERROR();
EXPECT_GE(maxIntegerSamples, 1);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxSamplesRGBA8I + 1, GL_RGBA8I, 64, 64);
ASSERT_GL_ERROR(GL_INVALID_OPERATION);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, maxIntegerSamples + 1, GL_RGBA8I, 64, 64);
ASSERT_GL_ERROR(GL_INVALID_OPERATION);
}
}
// Ensure that the following spec language is correctly implemented:
//
// the resulting value for RENDERBUFFER_SAMPLES is guaranteed to be greater than or equal to
// samples and no more than the next larger sample count supported by the implementation.
//
// For example, if 2, 4, and 8 samples are supported, if 5 samples are requested, ANGLE will
// use 8 samples, and return 8 when GL_RENDERBUFFER_SAMPLES is queried.
TEST_P(RenderbufferMultisampleTest, OddSampleCount)
{
ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3);
glBindRenderbuffer(GL_RENDERBUFFER, mRenderbuffer);
ASSERT_GL_NO_ERROR();
// Lookup the supported number of sample counts
GLint numSampleCounts = 0;
std::vector<GLint> sampleCounts;
GLsizei queryBufferSize = 1;
glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8, GL_NUM_SAMPLE_COUNTS, queryBufferSize,
&numSampleCounts);
ANGLE_SKIP_TEST_IF((numSampleCounts < 2));
sampleCounts.resize(numSampleCounts);
queryBufferSize = numSampleCounts;
glGetInternalformativ(GL_RENDERBUFFER, GL_RGBA8, GL_SAMPLES, queryBufferSize,
sampleCounts.data());
// Look for two sample counts that are not 1 apart (e.g. 2 and 4). Request a sample count
// that's between those two samples counts (e.g. 3) and ensure that GL_RENDERBUFFER_SAMPLES
// is the higher number.
for (int i = 1; i < numSampleCounts; i++)
{
if (sampleCounts[i - 1] > (sampleCounts[i] + 1))
{
glRenderbufferStorageMultisample(GL_RENDERBUFFER, sampleCounts[i] + 1, GL_RGBA8, 64,
64);
ASSERT_GL_NO_ERROR();
GLint renderbufferSamples = 0;
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES,
&renderbufferSamples);
ASSERT_GL_NO_ERROR();
EXPECT_EQ(renderbufferSamples, sampleCounts[i - 1]);
break;
}
}
}
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(RenderbufferMultisampleTest);
ANGLE_INSTANTIATE_TEST_ES3_AND_ES31(RenderbufferMultisampleTest);
} // namespace