1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/test/test_web_graphics_context_3d.h"
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gpu/GLES2/gl2extchromium.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "third_party/khronos/GLES2/gl2ext.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace cc {
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace {
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static bool check_parameter_value(TestWebGraphicsContext3D* context,
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLenum pname,
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  GLint expected_value) {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLint actual_value = 0;
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->getTexParameteriv(GL_TEXTURE_2D, pname, &actual_value);
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return expected_value == actual_value;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void expect_default_parameter_values(TestWebGraphicsContext3D* context) {
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(context, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR));
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(context, GL_TEXTURE_WRAP_S, GL_REPEAT));
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(context, GL_TEXTURE_WRAP_T, GL_REPEAT));
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context, GL_TEXTURE_POOL_CHROMIUM, GL_TEXTURE_POOL_UNMANAGED_CHROMIUM));
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(context, GL_TEXTURE_USAGE_ANGLE, GL_NONE));
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(TestWebGraphicsContext3DTest, GetDefaultTextureParameterValues) {
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<TestWebGraphicsContext3D> context(
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TestWebGraphicsContext3D::Create());
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint texture = context->createTexture();
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->bindTexture(GL_TEXTURE_2D, texture);
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  expect_default_parameter_values(context.get());
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(TestWebGraphicsContext3DTest, SetAndGetTextureParameter) {
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<TestWebGraphicsContext3D> context(
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TestWebGraphicsContext3D::Create());
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint texture = context->createTexture();
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->bindTexture(GL_TEXTURE_2D, texture);
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      check_parameter_value(context.get(), GL_TEXTURE_MIN_FILTER, GL_NEAREST));
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST(TestWebGraphicsContext3DTest,
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)     SetAndGetMultipleTextureParametersOnMultipleTextures) {
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<TestWebGraphicsContext3D> context(
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      TestWebGraphicsContext3D::Create());
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set and get non-default texture parameters on the first texture.
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint first_texture = context->createTexture();
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->bindTexture(GL_TEXTURE_2D, first_texture);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      check_parameter_value(context.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR));
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      check_parameter_value(context.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST));
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set and get different, non-default texture parameters on the second
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // texture.
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GLuint second_texture = context->createTexture();
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->bindTexture(GL_TEXTURE_2D, second_texture);
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->texParameteri(
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->texParameteri(
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST));
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(check_parameter_value(
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      context.get(), GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR));
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Get texture parameters on the first texture and verify they are still
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // intact.
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  context->bindTexture(GL_TEXTURE_2D, first_texture);
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      check_parameter_value(context.get(), GL_TEXTURE_MIN_FILTER, GL_LINEAR));
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_TRUE(
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      check_parameter_value(context.get(), GL_TEXTURE_MAG_FILTER, GL_NEAREST));
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace cc
98