OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |