blob: d5c1e17aa1dbf646fa9a85e5f97c791089ce7969 [file] [log] [blame]
Timothy Liang7ac582e2018-08-06 09:47:23 -04001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef GrMtlPipelineState_DEFINED
9#define GrMtlPipelineState_DEFINED
10
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "include/private/GrTypesPriv.h"
12#include "src/gpu/GrStencilSettings.h"
13#include "src/gpu/glsl/GrGLSLProgramBuilder.h"
14#include "src/gpu/mtl/GrMtlBuffer.h"
15#include "src/gpu/mtl/GrMtlPipelineStateDataManager.h"
Timothy Liang057c3902018-08-08 10:48:45 -040016
Aaron O'Mullan829b6a02019-07-08 01:31:14 +020017#import <Metal/Metal.h>
Timothy Liang7ac582e2018-08-06 09:47:23 -040018
19class GrMtlGpu;
Timothy Liang6ed63962018-08-10 09:49:44 -040020class GrMtlPipelineStateDataManager;
21class GrMtlSampler;
22class GrMtlTexture;
23class GrPipeline;
Timothy Liang7ac582e2018-08-06 09:47:23 -040024
Timothy Liang057c3902018-08-08 10:48:45 -040025/**
26 * Wraps a MTLRenderPipelineState object and also contains more info about the pipeline as needed
27 * by Ganesh
28 */
Timothy Liang7ac582e2018-08-06 09:47:23 -040029class GrMtlPipelineState {
30public:
Timothy Liang6ed63962018-08-10 09:49:44 -040031 using UniformInfoArray = GrMtlPipelineStateDataManager::UniformInfoArray;
32 using UniformHandle = GrGLSLProgramDataManager::UniformHandle;
33
34 GrMtlPipelineState(
35 GrMtlGpu* gpu,
Jim Van Verth36b86af2020-08-24 17:16:46 +000036 id<MTLRenderPipelineState> pipelineState,
Timothy Liang6ed63962018-08-10 09:49:44 -040037 MTLPixelFormat pixelFormat,
38 const GrGLSLBuiltinUniformHandles& builtinUniformHandles,
39 const UniformInfoArray& uniforms,
Ethan Nicholase5dc1eb2019-08-13 17:02:25 -040040 uint32_t uniformBufferSize,
Timothy Liang6ed63962018-08-10 09:49:44 -040041 uint32_t numSamplers,
42 std::unique_ptr<GrGLSLPrimitiveProcessor> geometryProcessor,
Brian Salomon17f95b12021-02-23 09:35:08 -050043 std::unique_ptr<GrGLSLXferProcessor> xferProcessor,
44 std::vector<std::unique_ptr<GrGLSLFragmentProcessor>> fpImpls);
Timothy Liang7ac582e2018-08-06 09:47:23 -040045
Jim Van Verth36b86af2020-08-24 17:16:46 +000046 id<MTLRenderPipelineState> mtlPipelineState() { return fPipelineState; }
Timothy Liang7ac582e2018-08-06 09:47:23 -040047
Robert Phillips901aff02019-10-08 12:32:56 -040048 void setData(const GrRenderTarget*, const GrProgramInfo&);
Timothy Liang057c3902018-08-08 10:48:45 -040049
Chris Dalton2e7ed262020-02-21 15:17:59 -070050 void setTextures(const GrPrimitiveProcessor&, const GrPipeline&, const GrSurfaceProxy* const[]);
Jim Van Verth9042d462019-11-18 11:58:25 -050051 void bindTextures(id<MTLRenderCommandEncoder> renderCmdEncoder);
52
Brian Salomon982f5462020-03-30 12:52:33 -040053 void setDrawState(id<MTLRenderCommandEncoder>,
54 const GrSwizzle& writeSwizzle,
Greg Daniel2c3398d2019-06-19 11:58:01 -040055 const GrXferProcessor&);
Ethan Nicholas01063512018-10-08 16:58:25 -040056
Jim Van Verth686046b2019-03-18 15:39:22 -040057 static void SetDynamicScissorRectState(id<MTLRenderCommandEncoder> renderCmdEncoder,
58 const GrRenderTarget* renderTarget,
59 GrSurfaceOrigin rtOrigin,
60 SkIRect scissorRect);
61
Jim Van Verthf3b27b42019-04-24 14:29:37 -040062 bool doesntSampleAttachment(const MTLRenderPassAttachmentDescriptor*) const;
63
Timothy Liang6ed63962018-08-10 09:49:44 -040064private:
65 /**
66 * We use the RT's size and origin to adjust from Skia device space to Metal normalized device
67 * space and to make device space positions have the correct origin for processors that require
68 * them.
69 */
70 struct RenderTargetState {
71 SkISize fRenderTargetSize;
72 GrSurfaceOrigin fRenderTargetOrigin;
73
74 RenderTargetState() { this->invalidate(); }
75 void invalidate() {
76 fRenderTargetSize.fWidth = -1;
77 fRenderTargetSize.fHeight = -1;
78 fRenderTargetOrigin = (GrSurfaceOrigin)-1;
79 }
80
81 /**
82 * Gets a float4 that adjusts the position from Skia device coords to Metals normalized
83 * device coords. Assuming the transformed position, pos, is a homogeneous float3, the vec,
84 * v, is applied as such:
85 * pos.x = dot(v.xy, pos.xz)
86 * pos.y = dot(v.zw, pos.yz)
87 */
88 void getRTAdjustmentVec(float* destVec) {
89 destVec[0] = 2.f / fRenderTargetSize.fWidth;
90 destVec[1] = -1.f;
91 if (kBottomLeft_GrSurfaceOrigin == fRenderTargetOrigin) {
92 destVec[2] = -2.f / fRenderTargetSize.fHeight;
93 destVec[3] = 1.f;
94 } else {
95 destVec[2] = 2.f / fRenderTargetSize.fHeight;
96 destVec[3] = -1.f;
97 }
98 }
99 };
100
Robert Phillipsd0fe8752019-01-31 14:13:59 -0500101 void setRenderTargetState(const GrRenderTarget*, GrSurfaceOrigin);
Timothy Liang6ed63962018-08-10 09:49:44 -0400102
Jim Van Verth9042d462019-11-18 11:58:25 -0500103 void bindUniforms(id<MTLRenderCommandEncoder>);
Jim Van Verthba91f652019-03-19 12:18:31 -0400104
Greg Daniel2c3398d2019-06-19 11:58:01 -0400105 void setBlendConstants(id<MTLRenderCommandEncoder>, const GrSwizzle&, const GrXferProcessor&);
Jim Van Verthba91f652019-03-19 12:18:31 -0400106
107 void setDepthStencilState(id<MTLRenderCommandEncoder> renderCmdEncoder);
108
Timothy Liang6ed63962018-08-10 09:49:44 -0400109 struct SamplerBindings {
Jim Van Verth75c53262019-04-26 12:23:51 -0400110 GrMtlSampler* fSampler;
Timothy Liang6ed63962018-08-10 09:49:44 -0400111 id<MTLTexture> fTexture;
Timothy Liang6ed63962018-08-10 09:49:44 -0400112
Brian Salomonccb61422020-01-09 10:46:36 -0500113 SamplerBindings(GrSamplerState state, GrTexture* texture, GrMtlGpu*);
Timothy Liang6ed63962018-08-10 09:49:44 -0400114 };
115
116 GrMtlGpu* fGpu;
Jim Van Verth36b86af2020-08-24 17:16:46 +0000117 id<MTLRenderPipelineState> fPipelineState;
118 MTLPixelFormat fPixelFormat;
Timothy Liang6ed63962018-08-10 09:49:44 -0400119
120 RenderTargetState fRenderTargetState;
121 GrGLSLBuiltinUniformHandles fBuiltinUniformHandles;
122
Ethan Nicholas01063512018-10-08 16:58:25 -0400123 GrStencilSettings fStencil;
124
Timothy Liang6ed63962018-08-10 09:49:44 -0400125 int fNumSamplers;
126 SkTArray<SamplerBindings> fSamplerBindings;
127
128 std::unique_ptr<GrGLSLPrimitiveProcessor> fGeometryProcessor;
129 std::unique_ptr<GrGLSLXferProcessor> fXferProcessor;
Brian Salomon17f95b12021-02-23 09:35:08 -0500130 std::vector<std::unique_ptr<GrGLSLFragmentProcessor>> fFPImpls;
Timothy Liang6ed63962018-08-10 09:49:44 -0400131
132 GrMtlPipelineStateDataManager fDataManager;
Timothy Liang7ac582e2018-08-06 09:47:23 -0400133};
134
135#endif