summaryrefslogtreecommitdiffstats
path: root/src/3rdparty/angle/src/libANGLE/Compiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/3rdparty/angle/src/libANGLE/Compiler.cpp')
-rw-r--r--src/3rdparty/angle/src/libANGLE/Compiler.cpp143
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