19f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev// Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 29f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev// Use of this source code is governed by a BSD-style license that can be 39f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev// found in the LICENSE file. 49f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 59f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev#include "main.h" 69f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev#include "utils.h" 79f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev#include "testbase.h" 89f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 99f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 109f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevnamespace glbench { 119f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 129f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevclass AttributeFetchShaderTest : public DrawElementsTestFunc { 139f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev public: 149f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev AttributeFetchShaderTest() {} 159f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev virtual ~AttributeFetchShaderTest() {} 169f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev virtual bool Run(); 17f50ecb1b44db52db39768f55a03280e1fd8eeac7Alexey Marinichev virtual const char* Name() const { return "attribute_fetch_shader"; } 18bcad4fb80e1115af4aad4558d93be6dabf7a3f26Daniel Kurtz virtual bool IsDrawTest() const { return false; } 19aace01b7d49e41d1bd26be3767305f57e036e0d7Daniel Kurtz virtual const char* Unit() const { return "mvtx_sec"; } 209f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 219f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev private: 229f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev DISALLOW_COPY_AND_ASSIGN(AttributeFetchShaderTest); 239f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev}; 249f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 259f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 269f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevconst char *simple_vertex_shader = 279f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c1;" 289f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"void main() {" 299f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev" gl_Position = c1;" 309f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"}"; 319f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 329f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevconst char *simple_vertex_shader_2_attr = 339f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c1;" 349f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c2;" 359f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"void main() {" 369f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev" gl_Position = c1+c2;" 379f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"}"; 389f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 399f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevconst char *simple_vertex_shader_4_attr = 409f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c1;" 419f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c2;" 429f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c3;" 439f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c4;" 449f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"void main() {" 459f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev" gl_Position = c1+c2+c3+c4;" 469f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"}"; 479f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 489f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevconst char *simple_vertex_shader_8_attr = 499f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c1;" 509f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c2;" 519f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c3;" 529f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c4;" 539f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c5;" 549f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c6;" 559f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c7;" 569f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"attribute vec4 c8;" 579f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"void main() {" 589f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev" gl_Position = c1+c2+c3+c4+c5+c6+c7+c8;" 599f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"}"; 609f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 619f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevconst char *simple_fragment_shader = 629f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"void main() {" 639f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev" gl_FragColor = vec4(0.5);" 649f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev"}"; 659f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 669f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey MarinichevGLuint AttributeFetchShaderProgram(int attribute_count, 679f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint vertex_buffers[]) { 689f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev const char *vertex_shader = NULL; 699f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev switch (attribute_count) { 709f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev case 1: vertex_shader = simple_vertex_shader; break; 719f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev case 2: vertex_shader = simple_vertex_shader_2_attr; break; 729f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev case 4: vertex_shader = simple_vertex_shader_4_attr; break; 739f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev case 8: vertex_shader = simple_vertex_shader_8_attr; break; 749f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev default: return 0; 759f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev } 769f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint program = 779f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev InitShaderProgram(vertex_shader, simple_fragment_shader); 789f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 799f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev for (int i = 0; i < attribute_count; i++) { 809f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev char attribute[] = "c_"; 819f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev attribute[1] = '1' + i; 829f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev int attribute_index = glGetAttribLocation(program, attribute); 839f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glBindBuffer(GL_ARRAY_BUFFER, vertex_buffers[i]); 849f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glVertexAttribPointer(attribute_index, 2, GL_FLOAT, GL_FALSE, 0, NULL); 859f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glEnableVertexAttribArray(attribute_index); 869f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev } 879f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 889f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev return program; 899f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev} 909f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 919f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichevbool AttributeFetchShaderTest::Run() { 929f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLint width = 64; 939f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLint height = 64; 949f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 95c04bdd4a43f9a240961c8fb07afc1386fddb5826Ilja Friedel glViewport(0, 0, g_width, g_height); 969f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 979f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLfloat *vertices = NULL; 989f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLsizeiptr vertex_buffer_size = 0; 999f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev CreateLattice(&vertices, &vertex_buffer_size, 1.f / g_width, 1.f / g_height, 1009f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev width, height); 1019f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint vertex_buffer = SetupVBO(GL_ARRAY_BUFFER, 1029f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev vertex_buffer_size, vertices); 1039f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 104c33878b0587a1b46090e7249a87d32e7f88ed9aeStuart Abercrombie GLushort *indices = NULL; 1059f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint index_buffer = 0; 1069f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLsizeiptr index_buffer_size = 0; 1079f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1089f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev // Everything will be back-face culled. 1099f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev count_ = CreateMesh(&indices, &index_buffer_size, width, height, 0); 1109f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev index_buffer = SetupVBO(GL_ELEMENT_ARRAY_BUFFER, 1119f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev index_buffer_size, indices); 1129f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1139f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glEnable(GL_CULL_FACE); 1149f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1159f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint vertex_buffers[8]; 1169f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev for (GLuint i = 0; i < sizeof(vertex_buffers)/sizeof(vertex_buffers[0]); i++) 1179f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev vertex_buffers[i] = vertex_buffer; 1189f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1199f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev GLuint program = AttributeFetchShaderProgram(1, vertex_buffers); 120aace01b7d49e41d1bd26be3767305f57e036e0d7Daniel Kurtz RunTest(this, "attribute_fetch_shader", count_, g_width, g_height, true); 1219f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteProgram(program); 1229f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1239f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev program = AttributeFetchShaderProgram(2, vertex_buffers); 1249f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev RunTest(this, 125aace01b7d49e41d1bd26be3767305f57e036e0d7Daniel Kurtz "attribute_fetch_shader_2_attr", count_, g_width, g_height, true); 1269f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteProgram(program); 1279f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1289f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev program = AttributeFetchShaderProgram(4, vertex_buffers); 1299f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev RunTest(this, 130aace01b7d49e41d1bd26be3767305f57e036e0d7Daniel Kurtz "attribute_fetch_shader_4_attr", count_, g_width, g_height, true); 1319f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteProgram(program); 1329f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1339f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev program = AttributeFetchShaderProgram(8, vertex_buffers); 1349f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev RunTest(this, 135aace01b7d49e41d1bd26be3767305f57e036e0d7Daniel Kurtz "attribute_fetch_shader_8_attr", count_, g_width, g_height, true); 1369f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteProgram(program); 1379f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1389f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteBuffers(1, &index_buffer); 1399f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev delete[] indices; 1409f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1419f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev glDeleteBuffers(1, &vertex_buffer); 1429f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev delete[] vertices; 1439f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev return true; 1449f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev} 1459f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1469f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey MarinichevTestBase* GetAttributeFetchShaderTest() { 1479f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev return new AttributeFetchShaderTest(); 1489f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev} 1499f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev 1509f9b873ae65c0a087ed3cd9856121a6d41e3410aAlexey Marinichev} // namespace glbench 151