blob: 413ffbce67b8633c5e51e86451b18c5cc8c7f240 [file] [log] [blame]
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// mtl_msl_utils.h: Utilities to manipulate MSL.
//
#ifndef mtl_msl_utils_h
#define mtl_msl_utils_h
#include <memory>
#include "compiler/translator/msl/TranslatorMSL.h"
#include "libANGLE/Context.h"
#include "libANGLE/renderer/ProgramImpl.h"
#include "libANGLE/renderer/metal/mtl_common.h"
namespace rx
{
struct CompiledShaderStateMtl : angle::NonCopyable
{
sh::TranslatorMetalReflection translatorMetalReflection = {};
};
using SharedCompiledShaderStateMtl = std::shared_ptr<CompiledShaderStateMtl>;
namespace mtl
{
struct SamplerBinding
{
uint32_t textureBinding = 0;
uint32_t samplerBinding = 0;
};
struct TranslatedShaderInfo
{
void reset();
// Translated Metal source code
std::shared_ptr<const std::string> metalShaderSource;
// Metal library compiled from source code above. Used by ProgramMtl.
AutoObjCPtr<id<MTLLibrary>> metalLibrary;
std::array<SamplerBinding, kMaxGLSamplerBindings> actualSamplerBindings;
std::array<int, kMaxShaderImages> actualImageBindings;
std::array<uint32_t, kMaxGLUBOBindings> actualUBOBindings;
std::array<uint32_t, kMaxShaderXFBs> actualXFBBindings;
bool hasUBOArgumentBuffer;
bool hasInvariant;
};
void MSLGetShaderSource(const gl::ProgramState &programState,
const gl::ProgramLinkedResources &resources,
gl::ShaderMap<std::string> *shaderSourcesOut);
angle::Result MTLGetMSL(const gl::Context *glContext,
const gl::ProgramState &programState,
const gl::Caps &glCaps,
const gl::ShaderMap<std::string> &shaderSources,
const gl::ShaderMap<SharedCompiledShaderStateMtl> &shadersState,
gl::ShaderMap<TranslatedShaderInfo> *mslShaderInfoOut,
size_t xfbBufferCount);
// Get equivalent shadow compare mode that is used in translated msl shader.
uint MslGetShaderShadowCompareMode(GLenum mode, GLenum func);
} // namespace mtl
} // namespace rx
#endif /* mtl_msl_utils_h */