1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#ifndef GrD3DPipelineState_DEFINED 9cb93a386Sopenharmony_ci#define GrD3DPipelineState_DEFINED 10cb93a386Sopenharmony_ci 11cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 12cb93a386Sopenharmony_ci#include "include/gpu/GrTypes.h" 13cb93a386Sopenharmony_ci#include "include/gpu/d3d/GrD3DTypes.h" 14cb93a386Sopenharmony_ci#include "src/gpu/GrManagedResource.h" 15cb93a386Sopenharmony_ci#include "src/gpu/d3d/GrD3DPipelineStateDataManager.h" 16cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLProgramBuilder.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#include <vector> 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ciclass GrD3DDirectCommandList; 21cb93a386Sopenharmony_ciclass GrD3DGpu; 22cb93a386Sopenharmony_ciclass GrD3DPipeline; 23cb93a386Sopenharmony_ciclass GrD3DRootSignature; 24cb93a386Sopenharmony_ciclass GrProgramInfo; 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciclass GrD3DPipelineState { 27cb93a386Sopenharmony_cipublic: 28cb93a386Sopenharmony_ci using UniformInfoArray = GrD3DPipelineStateDataManager::UniformInfoArray; 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_ci GrD3DPipelineState(sk_sp<GrD3DPipeline> pipeline, 31cb93a386Sopenharmony_ci sk_sp<GrD3DRootSignature> rootSignature, 32cb93a386Sopenharmony_ci const GrGLSLBuiltinUniformHandles& builtinUniformHandles, 33cb93a386Sopenharmony_ci const UniformInfoArray& uniforms, 34cb93a386Sopenharmony_ci uint32_t uniformSize, 35cb93a386Sopenharmony_ci uint32_t numSamplers, 36cb93a386Sopenharmony_ci std::unique_ptr<GrGeometryProcessor::ProgramImpl> gpImpl, 37cb93a386Sopenharmony_ci std::unique_ptr<GrXferProcessor::ProgramImpl> xpImpl, 38cb93a386Sopenharmony_ci std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fpImpls, 39cb93a386Sopenharmony_ci size_t vertexStride, 40cb93a386Sopenharmony_ci size_t instanceStride); 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci const sk_sp<GrD3DPipeline>& pipeline() const { return fPipeline; } 43cb93a386Sopenharmony_ci const sk_sp<GrD3DRootSignature>& rootSignature() const { return fRootSignature; } 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci void setAndBindConstants(GrD3DGpu*, const GrRenderTarget*, const GrProgramInfo&); 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci void setAndBindTextures(GrD3DGpu*, 48cb93a386Sopenharmony_ci const GrGeometryProcessor&, 49cb93a386Sopenharmony_ci const GrSurfaceProxy* const geomProcTextures[], 50cb93a386Sopenharmony_ci const GrPipeline&); 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci void bindBuffers(GrD3DGpu*, sk_sp<const GrBuffer> indexBuffer, 53cb93a386Sopenharmony_ci sk_sp<const GrBuffer> instanceBuffer, sk_sp<const GrBuffer> vertexBuffer, 54cb93a386Sopenharmony_ci GrD3DDirectCommandList* commandList); 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci // We can only cache non dirty uniform values until we submit a command list. After that, the 57cb93a386Sopenharmony_ci // next frame will get a completely different uniform buffer and/or offset into the buffer. Thus 58cb93a386Sopenharmony_ci // we need a way to mark them all as dirty during submit. 59cb93a386Sopenharmony_ci void markUniformsDirty() { fDataManager.markDirty(); } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ciprivate: 62cb93a386Sopenharmony_ci /** 63cb93a386Sopenharmony_ci * We use the RT's size and origin to adjust from Skia device space to d3d normalized device 64cb93a386Sopenharmony_ci * space and to make device space positions have the correct origin for processors that require 65cb93a386Sopenharmony_ci * them. 66cb93a386Sopenharmony_ci */ 67cb93a386Sopenharmony_ci struct RenderTargetState { 68cb93a386Sopenharmony_ci SkISize fRenderTargetSize; 69cb93a386Sopenharmony_ci GrSurfaceOrigin fRenderTargetOrigin; 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci RenderTargetState() { this->invalidate(); } 72cb93a386Sopenharmony_ci void invalidate() { 73cb93a386Sopenharmony_ci fRenderTargetSize.fWidth = -1; 74cb93a386Sopenharmony_ci fRenderTargetSize.fHeight = -1; 75cb93a386Sopenharmony_ci fRenderTargetOrigin = (GrSurfaceOrigin)-1; 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci }; 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci // Helper for setData() that sets the view matrix and loads the render target height uniform 80cb93a386Sopenharmony_ci void setRenderTargetState(const GrRenderTarget*, GrSurfaceOrigin); 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ci sk_sp<GrD3DPipeline> fPipeline; 83cb93a386Sopenharmony_ci sk_sp<GrD3DRootSignature> fRootSignature; 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci // Tracks the current render target uniforms stored in the vertex buffer. 86cb93a386Sopenharmony_ci RenderTargetState fRenderTargetState; 87cb93a386Sopenharmony_ci GrGLSLBuiltinUniformHandles fBuiltinUniformHandles; 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci // Processors in the GrD3DPipelineState 90cb93a386Sopenharmony_ci std::unique_ptr<GrGeometryProcessor::ProgramImpl> fGPImpl; 91cb93a386Sopenharmony_ci std::unique_ptr<GrXferProcessor::ProgramImpl> fXPImpl; 92cb93a386Sopenharmony_ci std::vector<std::unique_ptr<GrFragmentProcessor::ProgramImpl>> fFPImpls; 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ci GrD3DPipelineStateDataManager fDataManager; 95cb93a386Sopenharmony_ci 96cb93a386Sopenharmony_ci unsigned int fNumSamplers; 97cb93a386Sopenharmony_ci size_t fVertexStride; 98cb93a386Sopenharmony_ci size_t fInstanceStride; 99cb93a386Sopenharmony_ci}; 100cb93a386Sopenharmony_ci 101cb93a386Sopenharmony_ci#endif 102