Hash :
9b63700b
Author :
Date :
2023-07-11T10:25:40
Translator: Reorganize files This change makes the translator files more organized by: - Grouping files that are specific to a certain output under their own directory, - Moving transformations under tree_ops - Removing Direct from metal translation now that that SPIR-V Cross path is removed Bug: angleproject:6394 Change-Id: Iaf5bb8d5604b84748dece029821b1f77b2813967 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4678780 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
//
// Copyright 2020 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.
//
#ifndef COMPILER_TRANSLATOR_MSL_PIPELINE_H_
#define COMPILER_TRANSLATOR_MSL_PIPELINE_H_
#include "compiler/translator/Symbol.h"
#include "compiler/translator/msl/ModifyStruct.h"
#include "compiler/translator/msl/Name.h"
#include "compiler/translator/msl/SymbolEnv.h"
namespace sh
{
// Data that is scoped as `external` and `internal` for a given pipeline.
template <typename T>
struct PipelineScoped
{
// Data that is configured to talk externally to the program.
// May coincide with `internal`, but may also diverge from `internal`.
const T *external = nullptr;
// Extra data that is configured to talk externally to the program.
// Used only for adjusting Metal's InstanceId.
const T *externalExtra = nullptr;
// Data that is configured to talk internally within the program.
// May coincide with `external`, but may also diverge from `external`.
const T *internal = nullptr;
// Returns true iff the input coincides with either `external` or `internal` data.
bool matches(const T &object) const { return external == &object || internal == &object; }
// Both `external` and `internal` representations are non-null.
bool isTotallyFull() const { return external && internal; }
// Both `external` and `internal` representations are null.
bool isTotallyEmpty() const { return !external && !internal; }
// Both `external` and `internal` representations are the same.
bool isUniform() const { return external == internal; }
};
// Represents a high-level program pipeline.
class Pipeline
{
public:
enum class Type
{
VertexIn,
VertexOut,
FragmentIn,
FragmentOut,
UserUniforms,
AngleUniforms,
NonConstantGlobals,
InvocationVertexGlobals,
InvocationFragmentGlobals,
UniformBuffer,
Texture,
Image,
InstanceId,
};
enum class Variant
{
// For all internal pipeline uses.
// For external pipeline uses if pipeline does not require splitting or saturation.
Original,
// Only for external pipeline uses if the pipeline was split or saturated.
Modified,
};
public:
// The type of the pipeline.
Type type;
// Non-null if a global instance of the pipeline struct already exists.
// If non-null struct splitting should not be needed.
const TVariable *globalInstanceVar;
public:
// Returns true iff the variable belongs to the pipeline.
bool uses(const TVariable &var) const;
// Returns the name for the struct type that stores variables of this pipeline.
Name getStructTypeName(Variant variant) const;
// Returns the name for the struct instance that stores variables of this pipeline.
Name getStructInstanceName(Variant variant) const;
ModifyStructConfig externalStructModifyConfig() const;
// Returns true if the pipeline always requires a non-parameter local instance declaration of
// the pipeline structures.
bool alwaysRequiresLocalVariableDeclarationInMain() const;
// Returns true iff the pipeline is an output pipeline. The external pipeline structure should
// be returned from `main`.
bool isPipelineOut() const;
AddressSpace externalAddressSpace() const;
};
// A collection of various pipeline structures.
struct PipelineStructs : angle::NonCopyable
{
PipelineScoped<TStructure> fragmentIn;
PipelineScoped<TStructure> fragmentOut;
PipelineScoped<TStructure> vertexIn;
PipelineScoped<TStructure> vertexOut;
PipelineScoped<TStructure> userUniforms;
PipelineScoped<TStructure> angleUniforms;
PipelineScoped<TStructure> nonConstantGlobals;
PipelineScoped<TStructure> invocationVertexGlobals;
PipelineScoped<TStructure> invocationFragmentGlobals;
PipelineScoped<TStructure> uniformBuffers;
PipelineScoped<TStructure> texture;
PipelineScoped<TStructure> image;
PipelineScoped<TStructure> instanceId;
bool matches(const TStructure &s, bool internal, bool external) const;
};
} // namespace sh
#endif // COMPILER_TRANSLATOR_MSL_PIPELINE_H_