1*8975f5c5SAndroid Build Coastguard Worker// 2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2019 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker// 6*8975f5c5SAndroid Build Coastguard Worker// ShaderMtl.mm: 7*8975f5c5SAndroid Build Coastguard Worker// Implements the class methods for ShaderMtl. 8*8975f5c5SAndroid Build Coastguard Worker// 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/ShaderMtl.h" 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker#include "common/WorkerThread.h" 13*8975f5c5SAndroid Build Coastguard Worker#include "common/debug.h" 14*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/Context.h" 15*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/Shader.h" 16*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/ContextMtl.h" 17*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/renderer/metal/DisplayMtl.h" 18*8975f5c5SAndroid Build Coastguard Worker#include "libANGLE/trace.h" 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Workernamespace rx 21*8975f5c5SAndroid Build Coastguard Worker{ 22*8975f5c5SAndroid Build Coastguard Workernamespace 23*8975f5c5SAndroid Build Coastguard Worker{ 24*8975f5c5SAndroid Build Coastguard Workerclass ShaderTranslateTaskMtl final : public ShaderTranslateTask 25*8975f5c5SAndroid Build Coastguard Worker{ 26*8975f5c5SAndroid Build Coastguard Worker public: 27*8975f5c5SAndroid Build Coastguard Worker ShaderTranslateTaskMtl(const SharedCompiledShaderStateMtl &shader) : mShader(shader) {} 28*8975f5c5SAndroid Build Coastguard Worker ~ShaderTranslateTaskMtl() override = default; 29*8975f5c5SAndroid Build Coastguard Worker 30*8975f5c5SAndroid Build Coastguard Worker void postTranslate(ShHandle compiler, const gl::CompiledShaderState &compiledState) override 31*8975f5c5SAndroid Build Coastguard Worker { 32*8975f5c5SAndroid Build Coastguard Worker sh::TranslatorMSL *translatorMSL = 33*8975f5c5SAndroid Build Coastguard Worker static_cast<sh::TShHandleBase *>(compiler)->getAsTranslatorMSL(); 34*8975f5c5SAndroid Build Coastguard Worker if (translatorMSL != nullptr) 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker // Copy reflection data from translation 37*8975f5c5SAndroid Build Coastguard Worker mShader->translatorMetalReflection = *translatorMSL->getTranslatorMetalReflection(); 38*8975f5c5SAndroid Build Coastguard Worker translatorMSL->getTranslatorMetalReflection()->reset(); 39*8975f5c5SAndroid Build Coastguard Worker } 40*8975f5c5SAndroid Build Coastguard Worker } 41*8975f5c5SAndroid Build Coastguard Worker 42*8975f5c5SAndroid Build Coastguard Worker private: 43*8975f5c5SAndroid Build Coastguard Worker SharedCompiledShaderStateMtl mShader; 44*8975f5c5SAndroid Build Coastguard Worker}; 45*8975f5c5SAndroid Build Coastguard Worker} // anonymous namespace 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard WorkerShaderMtl::ShaderMtl(const gl::ShaderState &state) : ShaderImpl(state) {} 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard WorkerShaderMtl::~ShaderMtl() {} 50*8975f5c5SAndroid Build Coastguard Worker 51*8975f5c5SAndroid Build Coastguard Workerstd::shared_ptr<ShaderTranslateTask> ShaderMtl::compile(const gl::Context *context, 52*8975f5c5SAndroid Build Coastguard Worker ShCompileOptions *options) 53*8975f5c5SAndroid Build Coastguard Worker{ 54*8975f5c5SAndroid Build Coastguard Worker ContextMtl *contextMtl = mtl::GetImpl(context); 55*8975f5c5SAndroid Build Coastguard Worker DisplayMtl *displayMtl = contextMtl->getDisplay(); 56*8975f5c5SAndroid Build Coastguard Worker 57*8975f5c5SAndroid Build Coastguard Worker // Create a new compiled shader state. Currently running program link jobs will use the 58*8975f5c5SAndroid Build Coastguard Worker // previous state. 59*8975f5c5SAndroid Build Coastguard Worker mCompiledState = std::make_shared<CompiledShaderStateMtl>(); 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker // TODO(jcunningham): Remove this workaround once correct fix to move validation to the very end 62*8975f5c5SAndroid Build Coastguard Worker // is in place. https://bugs.webkit.org/show_bug.cgi?id=224991 63*8975f5c5SAndroid Build Coastguard Worker options->validateAST = false; 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker options->simplifyLoopConditions = true; 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker options->initializeUninitializedLocals = true; 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker options->separateCompoundStructDeclarations = true; 70*8975f5c5SAndroid Build Coastguard Worker 71*8975f5c5SAndroid Build Coastguard Worker if (context->isWebGL() && mState.getShaderType() != gl::ShaderType::Compute) 72*8975f5c5SAndroid Build Coastguard Worker { 73*8975f5c5SAndroid Build Coastguard Worker options->initOutputVariables = true; 74*8975f5c5SAndroid Build Coastguard Worker } 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker options->metal.generateShareableShaders = 77*8975f5c5SAndroid Build Coastguard Worker displayMtl->getFeatures().generateShareableShaders.enabled; 78*8975f5c5SAndroid Build Coastguard Worker 79*8975f5c5SAndroid Build Coastguard Worker if (displayMtl->getFeatures().intelExplicitBoolCastWorkaround.enabled || 80*8975f5c5SAndroid Build Coastguard Worker options->metal.generateShareableShaders) 81*8975f5c5SAndroid Build Coastguard Worker { 82*8975f5c5SAndroid Build Coastguard Worker options->addExplicitBoolCasts = true; 83*8975f5c5SAndroid Build Coastguard Worker } 84*8975f5c5SAndroid Build Coastguard Worker 85*8975f5c5SAndroid Build Coastguard Worker options->clampPointSize = true; 86*8975f5c5SAndroid Build Coastguard Worker#if TARGET_OS_IPHONE && !TARGET_OS_MACCATALYST 87*8975f5c5SAndroid Build Coastguard Worker options->clampFragDepth = true; 88*8975f5c5SAndroid Build Coastguard Worker#endif 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker if (displayMtl->getFeatures().emulateAlphaToCoverage.enabled) 91*8975f5c5SAndroid Build Coastguard Worker { 92*8975f5c5SAndroid Build Coastguard Worker options->emulateAlphaToCoverage = true; 93*8975f5c5SAndroid Build Coastguard Worker } 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker // Constants: 96*8975f5c5SAndroid Build Coastguard Worker options->metal.driverUniformsBindingIndex = mtl::kDriverUniformsBindingIndex; 97*8975f5c5SAndroid Build Coastguard Worker options->metal.defaultUniformsBindingIndex = mtl::kDefaultUniformsBindingIndex; 98*8975f5c5SAndroid Build Coastguard Worker options->metal.UBOArgumentBufferBindingIndex = mtl::kUBOArgumentBufferBindingIndex; 99*8975f5c5SAndroid Build Coastguard Worker 100*8975f5c5SAndroid Build Coastguard Worker // GL_ANGLE_shader_pixel_local_storage. 101*8975f5c5SAndroid Build Coastguard Worker if (displayMtl->getNativeExtensions().shaderPixelLocalStorageANGLE) 102*8975f5c5SAndroid Build Coastguard Worker { 103*8975f5c5SAndroid Build Coastguard Worker options->pls = displayMtl->getNativePixelLocalStorageOptions(); 104*8975f5c5SAndroid Build Coastguard Worker } 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker options->preTransformTextureCubeGradDerivatives = 107*8975f5c5SAndroid Build Coastguard Worker displayMtl->getFeatures().preTransformTextureCubeGradDerivatives.enabled; 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Worker options->rescopeGlobalVariables = displayMtl->getFeatures().rescopeGlobalVariables.enabled; 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Worker if (displayMtl->getFeatures().injectAsmStatementIntoLoopBodies.enabled) 112*8975f5c5SAndroid Build Coastguard Worker { 113*8975f5c5SAndroid Build Coastguard Worker options->metal.injectAsmStatementIntoLoopBodies = true; 114*8975f5c5SAndroid Build Coastguard Worker } 115*8975f5c5SAndroid Build Coastguard Worker 116*8975f5c5SAndroid Build Coastguard Worker return std::shared_ptr<ShaderTranslateTask>(new ShaderTranslateTaskMtl(mCompiledState)); 117*8975f5c5SAndroid Build Coastguard Worker} 118*8975f5c5SAndroid Build Coastguard Worker 119*8975f5c5SAndroid Build Coastguard Workerstd::shared_ptr<ShaderTranslateTask> ShaderMtl::load(const gl::Context *context, 120*8975f5c5SAndroid Build Coastguard Worker gl::BinaryInputStream *stream) 121*8975f5c5SAndroid Build Coastguard Worker{ 122*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE(); 123*8975f5c5SAndroid Build Coastguard Worker return std::shared_ptr<ShaderTranslateTask>(new ShaderTranslateTask); 124*8975f5c5SAndroid Build Coastguard Worker} 125*8975f5c5SAndroid Build Coastguard Worker 126*8975f5c5SAndroid Build Coastguard Workerstd::string ShaderMtl::getDebugInfo() const 127*8975f5c5SAndroid Build Coastguard Worker{ 128*8975f5c5SAndroid Build Coastguard Worker return mState.getCompiledState()->translatedSource; 129*8975f5c5SAndroid Build Coastguard Worker} 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Worker} // namespace rx 132