}
template <typename api>
-class CNonZeroReservedMustBeZeroArray : public DrawIndirectBase
-{
- virtual std::string Title()
- {
- return "non-zero reservedMustBeZero - glDrawArrayIndirect";
- }
-
- virtual std::string Purpose()
- {
- return "Verify that no driver crash occurred";
- }
-
- virtual std::string Method()
- {
- return "Call glDrawArrayIndirect with non-zero ReservedMustBeZero";
- }
-
- virtual std::string PassCriteria()
- {
- return "The test will pass if no OpenGL errors reported and no driver crash occurred";
- }
-
- virtual long Setup()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- return NO_ERROR;
- }
-
- virtual long Run()
- {
- _program = CreateProgram(shaders::vshSimple<api>(), "", shaders::fshSimple<api>(), true);
- if (!_program)
- {
- return ERROR;
- }
- glUseProgram(_program);
-
- CColorArray coords;
- PrimitiveGen(GL_TRIANGLES, 8, 8, coords);
-
- glGenVertexArrays(1, &_vao);
- glBindVertexArray(_vao);
-
- glGenBuffers(1, &_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, _buffer);
-
- glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(coords.size() * sizeof(coords[0])), &coords[0], GL_STREAM_DRAW);
- glVertexAttribPointer(0, sizeof(coords[0]) / sizeof(float), GL_FLOAT, GL_FALSE, sizeof(coords[0]), 0);
- glEnableVertexAttribArray(0);
-
- DrawArraysIndirectCommand indirectArrays = { 0, 0, 0, 0 };
- indirectArrays.count = static_cast<GLuint>(coords.size());
- indirectArrays.primCount = 1;
- indirectArrays.first = 0;
- indirectArrays.reservedMustBeZero = 2312;
-
- glGenBuffers(1, &_bufferIndirect);
- glBindBuffer(GL_DRAW_INDIRECT_BUFFER, _bufferIndirect);
- glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(DrawArraysIndirectCommand), &indirectArrays, GL_STATIC_DRAW);
-
- glDrawArraysIndirect(GL_TRIANGLES, 0);
-
- DIResult result;
- if (glGetError() == GL_NO_ERROR)
- {
- //No GL error: undefined
- }
- else
- {
- result.error() << "Invalid error code returned by a driver";
- }
-
- return result.code();
- }
-
- virtual long Cleanup()
- {
- glDisableVertexAttribArray(0);
- glUseProgram(0);
- glDeleteProgram(_program);
- glDeleteVertexArrays(1, &_vao);
- glDeleteBuffers(1, &_buffer);
- glDeleteBuffers(1, &_bufferIndirect);
- return NO_ERROR;
- }
-
-private:
- GLuint _program;
- GLuint _vao, _buffer, _bufferIndirect;
-};
-
-template <typename api>
-struct CNonZeroReservedMustBeZeroElements : public DrawIndirectBase
-{
- virtual std::string Title()
- {
- return "non-zero reservedMustBeZero - glDrawElementsIndirect";
- }
-
- virtual std::string Purpose()
- {
- return "Verify that no driver crash occurred";
- }
-
- virtual std::string Method()
- {
- return "Call glDrawElementsIndirect with non-zero ReservedMustBeZero";
- }
-
- virtual std::string PassCriteria()
- {
- return "The test will pass if no OpenGL errors reported and no driver crash occurred";
- }
-
- virtual long Setup()
- {
- glClear(GL_COLOR_BUFFER_BIT);
- return NO_ERROR;
- }
-
- virtual long Run()
- {
- _program = CreateProgram(shaders::vshSimple<api>(), "", shaders::fshSimple<api>(), true);
- if (!_program)
- {
- return ERROR;
- }
- glUseProgram(_program);
-
- CColorArray coords;
- PrimitiveGen(GL_TRIANGLES, 8, 8, coords);
-
- glGenVertexArrays(1, &_vao);
- glBindVertexArray(_vao);
-
- glGenBuffers(1, &_buffer);
- glBindBuffer(GL_ARRAY_BUFFER, _buffer);
-
- glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)(coords.size() * sizeof(coords[0])), &coords[0], GL_STREAM_DRAW);
- glVertexAttribPointer(0, sizeof(coords[0]) / sizeof(float), GL_FLOAT, GL_FALSE, sizeof(coords[0]), 0);
- glEnableVertexAttribArray(0);
-
- DrawElementsIndirectCommand indirectElements = { 0, 0, 0, 0, 0 };
- indirectElements.count = static_cast<GLuint>(coords.size());
- indirectElements.primCount = 1;
- indirectElements.baseVertex = 0;
- indirectElements.firstIndex = 0;
- indirectElements.reservedMustBeZero = 1;
-
- CElementArray elements(coords.size(), 0);
- for (size_t i = 0; i < elements.size(); ++i)
- {
- elements[i] = static_cast<GLuint>(i);
- }
-
- glGenBuffers(1, &_bufferIndirect);
- glBindBuffer(GL_DRAW_INDIRECT_BUFFER, _bufferIndirect);
- glBufferData(GL_DRAW_INDIRECT_BUFFER, sizeof(DrawElementsIndirectCommand), &indirectElements, GL_STATIC_DRAW);
-
- glGenBuffers(1, &_ebo);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, (GLsizeiptr)(elements.size() * sizeof(elements[0])), &elements[0],
- GL_STATIC_DRAW);
-
- glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0);
-
- DIResult result;
- if (glGetError() == GL_NO_ERROR)
- {
- //No GL error: undefined
- }
- else
- {
- result.error() << "Invalid error code returned by a driver";
- }
-
- return result.code();
- }
-
- virtual long Cleanup()
- {
- glDisableVertexAttribArray(0);
- glUseProgram(0);
- glDeleteProgram(_program);
- glDeleteVertexArrays(1, &_vao);
- glDeleteBuffers(1, &_buffer);
- glDeleteBuffers(1, &_ebo);
- glDeleteBuffers(1, &_bufferIndirect);
- return NO_ERROR;
- }
-
-private:
- GLuint _program;
- GLuint _vao, _buffer, _ebo, _bufferIndirect;
-};
-
-template <typename api>
struct CNegativeZeroBufferArray : public DrawIndirectBase
{
virtual std::string Title()
addChild(new TestSubcase(m_context, "advanced-primitiveRestart-elements",
TestSubcase::Create<CPrimitiveRestartElements<test_api::GL> >));
- // reservedMustBeZero field got defined after GL 4.2, so those tests only make sense before 4.2
- const glu::ContextType& type = m_context.getRenderContext().getType();
- if (!glu::contextSupports(type, glu::ApiType::core(4, 2)))
- {
- addChild(new TestSubcase(m_context, "misc-reservedMustBeZero-arrays",
- TestSubcase::Create<CNonZeroReservedMustBeZeroArray<test_api::GL> >));
- addChild(new TestSubcase(m_context, "misc-reservedMustBeZero-elements",
- TestSubcase::Create<CNonZeroReservedMustBeZeroElements<test_api::GL> >));
- }
-
addChild(new TestSubcase(m_context, "negative-noindirect-arrays",
TestSubcase::Create<CNegativeZeroBufferArray<test_api::GL> >));
addChild(new TestSubcase(m_context, "negative-noindirect-elements",
addChild(new TestSubcase(m_context, "advanced-primitiveRestart-elements",
TestSubcase::Create<CPrimitiveRestartElements<test_api::ES3> >));
- addChild(new TestSubcase(m_context, "misc-reservedMustBeZero-arrays",
- TestSubcase::Create<CNonZeroReservedMustBeZeroArray<test_api::ES3> >));
- addChild(new TestSubcase(m_context, "misc-reservedMustBeZero-elements",
- TestSubcase::Create<CNonZeroReservedMustBeZeroElements<test_api::ES3> >));
-
addChild(new TestSubcase(m_context, "negative-noindirect-arrays",
TestSubcase::Create<CNegativeZeroBufferArray<test_api::ES3> >));
addChild(new TestSubcase(m_context, "negative-noindirect-elements",