Path: blob/main_old/src/tests/test_utils/MultiviewTest.cpp
1693 views
//1// Copyright 2018 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//5// MultiviewTest:6// Implementation of helpers for multiview testing.7//89#include "test_utils/MultiviewTest.h"10#include "platform/FeaturesD3D.h"11#include "test_utils/gl_raii.h"1213namespace angle14{1516GLuint CreateSimplePassthroughProgram(int numViews, ExtensionName multiviewExtension)17{18std::string ext;19switch (multiviewExtension)20{21case multiview:22ext = "GL_OVR_multiview";23break;24case multiview2:25ext = "GL_OVR_multiview2";26break;27default:28// Unknown extension.29break;30}3132const std::string vsSource =33"#version 300 es\n"34"#extension " +35ext +36" : require\n"37"layout(num_views = " +38ToString(numViews) +39") in;\n"40"layout(location=0) in vec2 vPosition;\n"41"void main()\n"42"{\n"43" gl_PointSize = 1.;\n"44" gl_Position = vec4(vPosition.xy, 0.0, 1.0);\n"45"}\n";4647const std::string fsSource =48"#version 300 es\n"49"#extension " +50ext +51" : require\n"52"precision mediump float;\n"53"out vec4 col;\n"54"void main()\n"55"{\n"56" col = vec4(0,1,0,1);\n"57"}\n";58return CompileProgram(vsSource.c_str(), fsSource.c_str());59}6061void CreateMultiviewBackingTextures(int samples,62int viewWidth,63int height,64int numLayers,65std::vector<GLuint> colorTextures,66GLuint depthTexture,67GLuint depthStencilTexture)68{69// The same zero data is used to initialize both color and depth/stencil textures.70std::vector<GLubyte> textureData;71textureData.resize(viewWidth * height * numLayers * 4, 0u);7273// We can't upload data to multisample textures, so we clear them using a temporary framebuffer74// instead. The current framebuffer binding is stored so we can restore it once we're done with75// using the temporary framebuffers.76GLint restoreDrawFramebuffer;77glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &restoreDrawFramebuffer);7879// Create color and depth textures.80GLenum texTarget = (samples > 0) ? GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES : GL_TEXTURE_2D_ARRAY;81for (auto colorTexture : colorTextures)82{83glBindTexture(texTarget, colorTexture);84if (samples > 0)85{86glTexStorage3DMultisampleOES(texTarget, samples, GL_RGBA8, viewWidth, height, numLayers,87false);8889GLFramebuffer tempFbo;90glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tempFbo);91glClearColor(0.0f, 0.0f, 0.0f, 0.0f);92for (int layerIndex = 0; layerIndex < numLayers; ++layerIndex)93{94glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, colorTexture,950, layerIndex);96glClear(GL_COLOR_BUFFER_BIT);97}98}99else100{101glTexImage3D(texTarget, 0, GL_RGBA8, viewWidth, height, numLayers, 0, GL_RGBA,102GL_UNSIGNED_BYTE, textureData.data());103glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);104glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);105}106}107108if (depthTexture != 0)109{110glBindTexture(texTarget, depthTexture);111if (samples > 0)112{113glTexStorage3DMultisampleOES(texTarget, samples, GL_DEPTH_COMPONENT32F, viewWidth,114height, numLayers, false);115116GLFramebuffer tempFbo;117glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tempFbo);118glClearDepthf(0.0f);119for (int layerIndex = 0; layerIndex < numLayers; ++layerIndex)120{121glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0,122layerIndex);123glClear(GL_DEPTH_BUFFER_BIT);124}125}126else127{128glTexImage3D(texTarget, 0, GL_DEPTH_COMPONENT32F, viewWidth, height, numLayers, 0,129GL_DEPTH_COMPONENT, GL_FLOAT, textureData.data());130}131}132if (depthStencilTexture != 0)133{134glBindTexture(texTarget, depthStencilTexture);135if (samples > 0)136{137glTexStorage3DMultisampleOES(texTarget, samples, GL_DEPTH24_STENCIL8, viewWidth, height,138numLayers, false);139140GLFramebuffer tempFbo;141glBindFramebuffer(GL_DRAW_FRAMEBUFFER, tempFbo);142glClearDepthf(0.0f);143glClearStencil(0);144for (int layerIndex = 0; layerIndex < numLayers; ++layerIndex)145{146glFramebufferTextureLayer(GL_DRAW_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,147depthTexture, 0, layerIndex);148glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);149}150}151else152{153glTexImage3D(texTarget, 0, GL_DEPTH24_STENCIL8, viewWidth, height, numLayers, 0,154GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, textureData.data());155}156}157glBindTexture(texTarget, 0);158ASSERT_GL_NO_ERROR();159160glBindFramebuffer(GL_DRAW_FRAMEBUFFER, restoreDrawFramebuffer);161}162163void CreateMultiviewBackingTextures(int samples,164int viewWidth,165int height,166int numLayers,167GLuint colorTexture,168GLuint depthTexture,169GLuint depthStencilTexture)170{171ASSERT_TRUE(colorTexture != 0u);172std::vector<GLuint> colorTextures(1, colorTexture);173CreateMultiviewBackingTextures(samples, viewWidth, height, numLayers, colorTextures,174depthTexture, depthStencilTexture);175}176177void AttachMultiviewTextures(GLenum target,178int viewWidth,179int numViews,180int baseViewIndex,181std::vector<GLuint> colorTextures,182GLuint depthTexture,183GLuint depthStencilTexture)184{185ASSERT_TRUE(depthTexture == 0u || depthStencilTexture == 0u);186for (size_t i = 0; i < colorTextures.size(); ++i)187{188GLenum attachment = static_cast<GLenum>(GL_COLOR_ATTACHMENT0 + i);189glFramebufferTextureMultiviewOVR(target, attachment, colorTextures[i], 0, baseViewIndex,190numViews);191}192if (depthTexture)193{194glFramebufferTextureMultiviewOVR(target, GL_DEPTH_ATTACHMENT, depthTexture, 0,195baseViewIndex, numViews);196}197if (depthStencilTexture)198{199glFramebufferTextureMultiviewOVR(target, GL_DEPTH_STENCIL_ATTACHMENT, depthStencilTexture,2000, baseViewIndex, numViews);201}202}203204void AttachMultiviewTextures(GLenum target,205int viewWidth,206int numViews,207int baseViewIndex,208GLuint colorTexture,209GLuint depthTexture,210GLuint depthStencilTexture)211{212ASSERT_TRUE(colorTexture != 0u);213std::vector<GLuint> colorTextures(1, colorTexture);214AttachMultiviewTextures(target, viewWidth, numViews, baseViewIndex, colorTextures, depthTexture,215depthStencilTexture);216}217218std::ostream &operator<<(std::ostream &os, const MultiviewImplementationParams ¶ms)219{220const PlatformParameters &base = static_cast<const PlatformParameters &>(params);221os << base << "_";222if (params.mForceUseGeometryShaderOnD3D)223{224os << "_force_geom_shader";225}226else227{228os << "_vertex_shader";229}230if (params.mMultiviewExtension)231{232os << "_multiview";233}234else235{236os << "_multiview2";237}238return os;239}240241MultiviewImplementationParams VertexShaderOpenGL(GLint majorVersion,242GLint minorVersion,243ExtensionName multiviewExtension)244{245return MultiviewImplementationParams(majorVersion, minorVersion, false, egl_platform::OPENGL(),246multiviewExtension);247}248249MultiviewImplementationParams VertexShaderVulkan(GLint majorVersion,250GLint minorVersion,251ExtensionName multiviewExtension)252{253return MultiviewImplementationParams(majorVersion, minorVersion, false, egl_platform::VULKAN(),254multiviewExtension);255}256257MultiviewImplementationParams VertexShaderD3D11(GLint majorVersion,258GLint minorVersion,259ExtensionName multiviewExtension)260{261return MultiviewImplementationParams(majorVersion, minorVersion, false, egl_platform::D3D11(),262multiviewExtension);263}264265MultiviewImplementationParams GeomShaderD3D11(GLint majorVersion,266GLint minorVersion,267ExtensionName multiviewExtension)268{269return MultiviewImplementationParams(majorVersion, minorVersion, true, egl_platform::D3D11(),270multiviewExtension);271}272273void MultiviewTest::overrideWorkaroundsD3D(FeaturesD3D *features)274{275features->overrideFeatures({"select_view_in_geometry_shader"},276GetParam().mForceUseGeometryShaderOnD3D);277}278279} // namespace angle280281282