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