Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: gpu/command_buffer/service/program_manager_unittest.cc

Issue 2142353002: Validate fbo color image format and fragment shader output variable type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "gpu/command_buffer/service/program_manager.h" 5 #include "gpu/command_buffer/service/program_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 return static_cast<const uint8_t*>(position) - 52 return static_cast<const uint8_t*>(position) -
53 static_cast<const uint8_t*>(start); 53 static_cast<const uint8_t*>(start);
54 } 54 }
55 55
56 } // namespace anonymous 56 } // namespace anonymous
57 57
58 class ProgramManagerTestBase : public GpuServiceTest { 58 class ProgramManagerTestBase : public GpuServiceTest {
59 protected: 59 protected:
60 virtual void SetupProgramManager() { 60 virtual void SetupProgramManager() {
61 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors, 61 manager_.reset(new ProgramManager(nullptr, kMaxVaryingVectors,
62 kMaxDrawBuffers,
62 kMaxDualSourceDrawBuffers, 63 kMaxDualSourceDrawBuffers,
63 gpu_preferences_, 64 gpu_preferences_,
64 feature_info_.get())); 65 feature_info_.get()));
65 } 66 }
66 void SetUpBase(const char* gl_version, 67 void SetUpBase(const char* gl_version,
67 const char* gl_extensions, 68 const char* gl_extensions,
68 FeatureInfo* feature_info = nullptr) { 69 FeatureInfo* feature_info = nullptr) {
69 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions); 70 GpuServiceTest::SetUpWithGLVersion(gl_version, gl_extensions);
70 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion( 71 TestHelper::SetupFeatureInfoInitExpectationsWithGLVersion(
71 gl_.get(), gl_extensions, "", gl_version); 72 gl_.get(), gl_extensions, "", gl_version);
(...skipping 1664 matching lines...) Expand 10 before | Expand all | Expand 10 after
1736 Program* program = 1737 Program* program =
1737 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1); 1738 SetupProgramForVariables(&kVertexAttribute, 1, &kFragmentUniform, 1);
1738 1739
1739 std::string conflicting_name; 1740 std::string conflicting_name;
1740 1741
1741 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name)); 1742 EXPECT_TRUE(program->DetectGlobalNameConflicts(&conflicting_name));
1742 EXPECT_EQ("a", conflicting_name); 1743 EXPECT_EQ("a", conflicting_name);
1743 EXPECT_TRUE(LinkAsExpected(program, false)); 1744 EXPECT_TRUE(LinkAsExpected(program, false));
1744 } 1745 }
1745 1746
1747 TEST_F(ProgramManagerWithShaderTest, FragmentOutputTypes) {
1748 // Set up program
1749 Shader* vshader = shader_manager_.CreateShader(
1750 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
1751 TestHelper::SetShaderStates(gl_.get(), vshader, true, nullptr, nullptr,
1752 nullptr, nullptr, nullptr, nullptr, nullptr,
1753 nullptr, nullptr);
1754 Shader* fshader = shader_manager_.CreateShader(
1755 kFragmentShaderClientId, kFragmentShaderServiceId, GL_FRAGMENT_SHADER);
1756 ASSERT_TRUE(vshader && fshader);
1757 Program* program =
1758 manager_->CreateProgram(kClientProgramId, kServiceProgramId);
1759 ASSERT_TRUE(program);
1760 EXPECT_TRUE(program->AttachShader(&shader_manager_, vshader));
1761 EXPECT_TRUE(program->AttachShader(&shader_manager_, fshader));
1762
1763 { // No outputs.
1764 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1765 nullptr, nullptr, nullptr, nullptr, nullptr,
1766 nullptr, nullptr);
1767 EXPECT_TRUE(LinkAsExpected(program, true));
1768 EXPECT_EQ(0u, program->fragment_output_type_mask());
1769 EXPECT_EQ(0u, program->fragment_output_written_mask());
1770 }
1771
1772 { // gl_FragColor
1773 OutputVariableList fragment_outputs;
1774 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1775 GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor");
1776 var.location = -1;
1777 fragment_outputs.push_back(var);
1778 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1779 nullptr, nullptr, nullptr, nullptr, nullptr,
1780 &fragment_outputs, nullptr);
1781 EXPECT_TRUE(LinkAsExpected(program, true));
1782 EXPECT_EQ(0x3u, program->fragment_output_type_mask());
1783 EXPECT_EQ(0x3u, program->fragment_output_written_mask());
1784 }
1785
1786 { // gl_FragData
1787 OutputVariableList fragment_outputs;
1788 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1789 GL_FLOAT_VEC4, 8, GL_MEDIUM_FLOAT, true, "gl_FragData");
1790 var.location = -1;
1791 fragment_outputs.push_back(var);
1792 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1793 nullptr, nullptr, nullptr, nullptr, nullptr,
1794 &fragment_outputs, nullptr);
1795 EXPECT_TRUE(LinkAsExpected(program, true));
1796 EXPECT_EQ(0xFFFFu, program->fragment_output_type_mask());
1797 EXPECT_EQ(0xFFFFu, program->fragment_output_written_mask());
1798 }
1799
1800 { // gl_FragColor, gl_FragDepth
1801 OutputVariableList fragment_outputs;
1802 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1803 GL_FLOAT_VEC4, 0, GL_MEDIUM_FLOAT, true, "gl_FragColor");
1804 var.location = -1;
1805 fragment_outputs.push_back(var);
1806 var = TestHelper::ConstructOutputVariable(
1807 GL_FLOAT, 0, GL_MEDIUM_FLOAT, true, "gl_FragDepth");
1808 var.location = -1;
1809 fragment_outputs.push_back(var);
1810 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1811 nullptr, nullptr, nullptr, nullptr, nullptr,
1812 &fragment_outputs, nullptr);
1813 EXPECT_TRUE(LinkAsExpected(program, true));
1814 EXPECT_EQ(0x3u, program->fragment_output_type_mask());
1815 EXPECT_EQ(0x3u, program->fragment_output_written_mask());
1816 }
1817
1818 { // Single user defined output.
1819 OutputVariableList fragment_outputs;
1820 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1821 GL_UNSIGNED_INT_VEC4, 0, GL_MEDIUM_INT, true, "myOutput");
1822 var.location = -1;
1823 fragment_outputs.push_back(var);
1824 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1825 nullptr, nullptr, nullptr, nullptr, nullptr,
1826 &fragment_outputs, nullptr);
1827 EXPECT_TRUE(LinkAsExpected(program, true));
1828 EXPECT_EQ(0x2u, program->fragment_output_type_mask());
1829 EXPECT_EQ(0x3u, program->fragment_output_written_mask());
1830 }
1831
1832 { // Single user defined output - no static use.
1833 OutputVariableList fragment_outputs;
1834 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1835 GL_UNSIGNED_INT_VEC4, 0, GL_MEDIUM_INT, false, "myOutput");
1836 var.location = -1;
1837 fragment_outputs.push_back(var);
1838 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1839 nullptr, nullptr, nullptr, nullptr, nullptr,
1840 &fragment_outputs, nullptr);
1841 EXPECT_TRUE(LinkAsExpected(program, true));
1842 EXPECT_EQ(0x2u, program->fragment_output_type_mask());
1843 EXPECT_EQ(0x3u, program->fragment_output_written_mask());
1844 }
1845
1846 { // Multiple user defined outputs.
1847 OutputVariableList fragment_outputs;
1848 sh::OutputVariable var = TestHelper::ConstructOutputVariable(
1849 GL_INT_VEC4, 0, GL_MEDIUM_INT, true, "myOutput");
1850 var.location = 0;
1851 fragment_outputs.push_back(var);
1852 var = TestHelper::ConstructOutputVariable(
1853 GL_FLOAT_VEC4, 2, GL_MEDIUM_FLOAT, true, "myOutputArray");
1854 var.location = 2;
1855 fragment_outputs.push_back(var);
1856 TestHelper::SetShaderStates(gl_.get(), fshader, true, nullptr, nullptr,
1857 nullptr, nullptr, nullptr, nullptr, nullptr,
1858 &fragment_outputs, nullptr);
1859 EXPECT_TRUE(LinkAsExpected(program, true));
1860 EXPECT_EQ(0xF1u, program->fragment_output_type_mask());
1861 EXPECT_EQ(0xF3u, program->fragment_output_written_mask());
1862 }
1863 }
1864
1746 // Varyings go over 8 rows. 1865 // Varyings go over 8 rows.
1747 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) { 1866 TEST_F(ProgramManagerWithShaderTest, TooManyVaryings) {
1748 const VarInfo kVertexVaryings[] = { 1867 const VarInfo kVertexVaryings[] = {
1749 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1868 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1750 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1869 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1751 }; 1870 };
1752 const VarInfo kFragmentVaryings[] = { 1871 const VarInfo kFragmentVaryings[] = {
1753 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying }, 1872 { GL_FLOAT_VEC4, 4, GL_MEDIUM_FLOAT, true, "a", kVarVarying },
1754 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying } 1873 { GL_FLOAT_VEC4, 5, GL_MEDIUM_FLOAT, true, "b", kVarVarying }
1755 }; 1874 };
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1944 ProgramManagerWithCacheTest() 2063 ProgramManagerWithCacheTest()
1945 : cache_(new MockProgramCache()), 2064 : cache_(new MockProgramCache()),
1946 vertex_shader_(NULL), 2065 vertex_shader_(NULL),
1947 fragment_shader_(NULL), 2066 fragment_shader_(NULL),
1948 program_(NULL) { 2067 program_(NULL) {
1949 } 2068 }
1950 2069
1951 protected: 2070 protected:
1952 void SetupProgramManager() override { 2071 void SetupProgramManager() override {
1953 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors, 2072 manager_.reset(new ProgramManager(cache_.get(), kMaxVaryingVectors,
2073 kMaxDrawBuffers,
1954 kMaxDualSourceDrawBuffers, 2074 kMaxDualSourceDrawBuffers,
1955 gpu_preferences_, 2075 gpu_preferences_,
1956 feature_info_.get())); 2076 feature_info_.get()));
1957 } 2077 }
1958 2078
1959 void SetUp() override { 2079 void SetUp() override {
1960 ProgramManagerTestBase::SetUp(); 2080 ProgramManagerTestBase::SetUp();
1961 2081
1962 vertex_shader_ = shader_manager_.CreateShader( 2082 vertex_shader_ = shader_manager_.CreateShader(
1963 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER); 2083 kVertexShaderClientId, kVertexShaderServiceId, GL_VERTEX_SHADER);
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
2398 ProgramManagerDualSourceBlendingES2Test, 2518 ProgramManagerDualSourceBlendingES2Test,
2399 testing::Values( 2519 testing::Values(
2400 make_gl_ext_tuple("3.2", 2520 make_gl_ext_tuple("3.2",
2401 "GL_ARB_draw_buffers GL_ARB_blend_func_extended " 2521 "GL_ARB_draw_buffers GL_ARB_blend_func_extended "
2402 "GL_ARB_program_interface_query"), 2522 "GL_ARB_program_interface_query"),
2403 make_gl_ext_tuple("opengl es 3.1", 2523 make_gl_ext_tuple("opengl es 3.1",
2404 "GL_EXT_draw_buffers GL_EXT_blend_func_extended"))); 2524 "GL_EXT_draw_buffers GL_EXT_blend_func_extended")));
2405 2525
2406 } // namespace gles2 2526 } // namespace gles2
2407 } // namespace gpu 2527 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/program_manager.cc ('k') | gpu/command_buffer/service/shader_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698