diff options
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Compiler.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libANGLE/Compiler.cpp | 143 |
1 files changed, 115 insertions, 28 deletions
diff --git a/src/3rdparty/angle/src/libANGLE/Compiler.cpp b/src/3rdparty/angle/src/libANGLE/Compiler.cpp index 348c41bef3..236c7e1fc2 100644 --- a/src/3rdparty/angle/src/libANGLE/Compiler.cpp +++ b/src/3rdparty/angle/src/libANGLE/Compiler.cpp @@ -9,9 +9,9 @@ #include "libANGLE/Compiler.h" #include "common/debug.h" -#include "libANGLE/Data.h" +#include "libANGLE/ContextState.h" #include "libANGLE/renderer/CompilerImpl.h" -#include "libANGLE/renderer/ImplFactory.h" +#include "libANGLE/renderer/GLImplFactory.h" namespace gl { @@ -19,26 +19,46 @@ namespace gl namespace { -// Global count of active shader compiler handles. Needed to know when to call ShInitialize and -// ShFinalize. +// Global count of active shader compiler handles. Needed to know when to call sh::Initialize and +// sh::Finalize. size_t activeCompilerHandles = 0; +ShShaderSpec SelectShaderSpec(GLint majorVersion, GLint minorVersion, bool isWebGL) +{ + if (majorVersion >= 3) + { + if (minorVersion == 1) + { + return isWebGL ? SH_WEBGL3_SPEC : SH_GLES3_1_SPEC; + } + else + { + return isWebGL ? SH_WEBGL2_SPEC : SH_GLES3_SPEC; + } + } + return isWebGL ? SH_WEBGL_SPEC : SH_GLES2_SPEC; +} + } // anonymous namespace -Compiler::Compiler(rx::ImplFactory *implFactory, const gl::Data &data) +Compiler::Compiler(rx::GLImplFactory *implFactory, const ContextState &state) : mImplementation(implFactory->createCompiler()), - mSpec(data.clientVersion > 2 ? SH_GLES3_SPEC : SH_GLES2_SPEC), + mSpec(SelectShaderSpec(state.getClientMajorVersion(), + state.getClientMinorVersion(), + state.getExtensions().webglCompatibility)), mOutputType(mImplementation->getTranslatorOutputType()), mResources(), mFragmentCompiler(nullptr), - mVertexCompiler(nullptr) + mVertexCompiler(nullptr), + mComputeCompiler(nullptr), + mGeometryCompiler(nullptr) { - ASSERT(data.clientVersion == 2 || data.clientVersion == 3); + ASSERT(state.getClientMajorVersion() == 2 || state.getClientMajorVersion() == 3); - const gl::Caps &caps = *data.caps; - const gl::Extensions &extensions = *data.extensions; + const gl::Caps &caps = state.getCaps(); + const gl::Extensions &extensions = state.getExtensions(); - ShInitBuiltInResources(&mResources); + sh::InitBuiltInResources(&mResources); mResources.MaxVertexAttribs = caps.maxVertexAttributes; mResources.MaxVertexUniformVectors = caps.maxVertexUniformVectors; mResources.MaxVaryingVectors = caps.maxVaryingVectors; @@ -50,30 +70,79 @@ Compiler::Compiler(rx::ImplFactory *implFactory, const gl::Data &data) mResources.OES_standard_derivatives = extensions.standardDerivatives; mResources.EXT_draw_buffers = extensions.drawBuffers; mResources.EXT_shader_texture_lod = extensions.shaderTextureLOD; - // TODO: disabled until the extension is actually supported. - mResources.OES_EGL_image_external = 0; + mResources.OES_EGL_image_external = extensions.eglImageExternal; + mResources.OES_EGL_image_external_essl3 = extensions.eglImageExternalEssl3; + mResources.NV_EGL_stream_consumer_external = extensions.eglStreamConsumerExternal; + mResources.ARB_texture_rectangle = extensions.textureRectangle; // TODO: use shader precision caps to determine if high precision is supported? mResources.FragmentPrecisionHigh = 1; mResources.EXT_frag_depth = extensions.fragDepth; + // OVR_multiview state + mResources.OVR_multiview = extensions.multiview; + mResources.MaxViewsOVR = extensions.maxViews; + // GLSL ES 3.0 constants mResources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4; mResources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4; mResources.MinProgramTexelOffset = caps.minProgramTexelOffset; mResources.MaxProgramTexelOffset = caps.maxProgramTexelOffset; -} -Compiler::~Compiler() -{ - release(); - SafeDelete(mImplementation); + // GLSL ES 3.1 constants + mResources.MaxProgramTextureGatherOffset = caps.maxProgramTextureGatherOffset; + mResources.MinProgramTextureGatherOffset = caps.minProgramTextureGatherOffset; + mResources.MaxImageUnits = caps.maxImageUnits; + mResources.MaxVertexImageUniforms = caps.maxVertexImageUniforms; + mResources.MaxFragmentImageUniforms = caps.maxFragmentImageUniforms; + mResources.MaxComputeImageUniforms = caps.maxComputeImageUniforms; + mResources.MaxCombinedImageUniforms = caps.maxCombinedImageUniforms; + mResources.MaxCombinedShaderOutputResources = caps.maxCombinedShaderOutputResources; + mResources.MaxUniformLocations = caps.maxUniformLocations; + + for (size_t index = 0u; index < 3u; ++index) + { + mResources.MaxComputeWorkGroupCount[index] = caps.maxComputeWorkGroupCount[index]; + mResources.MaxComputeWorkGroupSize[index] = caps.maxComputeWorkGroupSize[index]; + } + + mResources.MaxComputeUniformComponents = caps.maxComputeUniformComponents; + mResources.MaxComputeTextureImageUnits = caps.maxComputeTextureImageUnits; + + mResources.MaxComputeAtomicCounters = caps.maxComputeAtomicCounters; + mResources.MaxComputeAtomicCounterBuffers = caps.maxComputeAtomicCounterBuffers; + + mResources.MaxVertexAtomicCounters = caps.maxVertexAtomicCounters; + mResources.MaxFragmentAtomicCounters = caps.maxFragmentAtomicCounters; + mResources.MaxCombinedAtomicCounters = caps.maxCombinedAtomicCounters; + mResources.MaxAtomicCounterBindings = caps.maxAtomicCounterBufferBindings; + mResources.MaxVertexAtomicCounterBuffers = caps.maxVertexAtomicCounterBuffers; + mResources.MaxFragmentAtomicCounterBuffers = caps.maxFragmentAtomicCounterBuffers; + mResources.MaxCombinedAtomicCounterBuffers = caps.maxCombinedAtomicCounterBuffers; + mResources.MaxAtomicCounterBufferSize = caps.maxAtomicCounterBufferSize; + + mResources.MaxUniformBufferBindings = caps.maxUniformBufferBindings; + mResources.MaxShaderStorageBufferBindings = caps.maxShaderStorageBufferBindings; + + // Needed by point size clamping workaround + mResources.MaxPointSize = caps.maxAliasedPointSize; + + if (state.getClientMajorVersion() == 2 && !extensions.drawBuffers) + { + mResources.MaxDrawBuffers = 1; + } + + // Geometry Shader constants + mResources.OES_geometry_shader = extensions.geometryShader; + // TODO(jiawei.shao@intel.com): initialize all implementation dependent geometry shader limits. + mResources.MaxGeometryOutputVertices = extensions.maxGeometryOutputVertices; + mResources.MaxGeometryShaderInvocations = extensions.maxGeometryShaderInvocations; } -Error Compiler::release() +Compiler::~Compiler() { if (mFragmentCompiler) { - ShDestruct(mFragmentCompiler); + sh::Destruct(mFragmentCompiler); mFragmentCompiler = nullptr; ASSERT(activeCompilerHandles > 0); @@ -82,21 +151,28 @@ Error Compiler::release() if (mVertexCompiler) { - ShDestruct(mVertexCompiler); + sh::Destruct(mVertexCompiler); mVertexCompiler = nullptr; ASSERT(activeCompilerHandles > 0); activeCompilerHandles--; } - if (activeCompilerHandles == 0) + if (mComputeCompiler) { - ShFinalize(); + sh::Destruct(mComputeCompiler); + mComputeCompiler = nullptr; + + ASSERT(activeCompilerHandles > 0); + activeCompilerHandles--; } - mImplementation->release(); + if (activeCompilerHandles == 0) + { + sh::Finalize(); + } - return gl::Error(GL_NO_ERROR); + ANGLE_SWALLOW_ERR(mImplementation->release()); } ShHandle Compiler::getCompilerHandle(GLenum type) @@ -111,7 +187,12 @@ ShHandle Compiler::getCompilerHandle(GLenum type) case GL_FRAGMENT_SHADER: compiler = &mFragmentCompiler; break; - + case GL_COMPUTE_SHADER: + compiler = &mComputeCompiler; + break; + case GL_GEOMETRY_SHADER_EXT: + compiler = &mGeometryCompiler; + break; default: UNREACHABLE(); return nullptr; @@ -121,14 +202,20 @@ ShHandle Compiler::getCompilerHandle(GLenum type) { if (activeCompilerHandles == 0) { - ShInitialize(); + sh::Initialize(); } - *compiler = ShConstructCompiler(type, mSpec, mOutputType, &mResources); + *compiler = sh::ConstructCompiler(type, mSpec, mOutputType, &mResources); + ASSERT(*compiler); activeCompilerHandles++; } return *compiler; } +const std::string &Compiler::getBuiltinResourcesString(GLenum type) +{ + return sh::GetBuiltInResourcesString(getCompilerHandle(type)); +} + } // namespace gl |