1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 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#include "experimental/graphite/include/Context.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "experimental/graphite/src/Caps.h" 11cb93a386Sopenharmony_ci#include "experimental/graphite/src/CommandBuffer.h" 12cb93a386Sopenharmony_ci#include "experimental/graphite/src/ContextUtils.h" 13cb93a386Sopenharmony_ci#include "experimental/graphite/src/Gpu.h" 14cb93a386Sopenharmony_ci#include "experimental/graphite/src/ProgramCache.h" 15cb93a386Sopenharmony_ci#include "experimental/graphite/src/Recorder.h" 16cb93a386Sopenharmony_ci#include "experimental/graphite/src/Recording.h" 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci#ifdef SK_METAL 19cb93a386Sopenharmony_ci#include "experimental/graphite/src/mtl/MtlTrampoline.h" 20cb93a386Sopenharmony_ci#endif 21cb93a386Sopenharmony_ci 22cb93a386Sopenharmony_cinamespace skgpu { 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ciContext::Context(sk_sp<Gpu> gpu) : fGpu(std::move(gpu)) {} 25cb93a386Sopenharmony_ciContext::~Context() {} 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci#ifdef SK_METAL 28cb93a386Sopenharmony_cisk_sp<Context> Context::MakeMetal(const mtl::BackendContext& backendContext) { 29cb93a386Sopenharmony_ci sk_sp<Gpu> gpu = mtl::Trampoline::MakeGpu(backendContext); 30cb93a386Sopenharmony_ci if (!gpu) { 31cb93a386Sopenharmony_ci return nullptr; 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci return sk_sp<Context>(new Context(std::move(gpu))); 35cb93a386Sopenharmony_ci} 36cb93a386Sopenharmony_ci#endif 37cb93a386Sopenharmony_ci 38cb93a386Sopenharmony_cisk_sp<Recorder> Context::createRecorder() { 39cb93a386Sopenharmony_ci return sk_make_sp<Recorder>(sk_ref_sp(this)); 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_civoid Context::insertRecording(std::unique_ptr<Recording> recording) { 43cb93a386Sopenharmony_ci fRecordings.emplace_back(std::move(recording)); 44cb93a386Sopenharmony_ci} 45cb93a386Sopenharmony_ci 46cb93a386Sopenharmony_civoid Context::submit(SyncToCpu syncToCpu) { 47cb93a386Sopenharmony_ci // TODO: we want Gpu::submit to take an array of command buffers but, for now, it just takes 48cb93a386Sopenharmony_ci // one. Once we have more than one recording queued up we will need to extract the 49cb93a386Sopenharmony_ci // command buffers and submit them as a block. 50cb93a386Sopenharmony_ci SkASSERT(fRecordings.size() == 1); 51cb93a386Sopenharmony_ci fGpu->submit(fRecordings[0]->fCommandBuffer); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci fGpu->checkForFinishedWork(syncToCpu); 54cb93a386Sopenharmony_ci fRecordings.clear(); 55cb93a386Sopenharmony_ci} 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_civoid Context::preCompile(const PaintCombo& paintCombo) { 58cb93a386Sopenharmony_ci ProgramCache cache; 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci for (auto bm: paintCombo.fBlendModes) { 61cb93a386Sopenharmony_ci for (auto& shaderCombo: paintCombo.fShaders) { 62cb93a386Sopenharmony_ci for (auto shaderType: shaderCombo.fTypes) { 63cb93a386Sopenharmony_ci for (auto tm: shaderCombo.fTileModes) { 64cb93a386Sopenharmony_ci Combination c {shaderType, tm, bm}; 65cb93a386Sopenharmony_ci 66cb93a386Sopenharmony_ci sk_sp<ProgramCache::ProgramInfo> pi = cache.findOrCreateProgram(c); 67cb93a386Sopenharmony_ci // TODO: this should be getSkSL 68cb93a386Sopenharmony_ci // TODO: it should also return the uniform information 69cb93a386Sopenharmony_ci std::string msl = pi->getMSL(); 70cb93a386Sopenharmony_ci // TODO: compile the MSL and store the result back into the ProgramInfo 71cb93a386Sopenharmony_ci // To do this we will need the path rendering options from Chris and 72cb93a386Sopenharmony_ci // a stock set of RenderPasses. 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci } 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci } 77cb93a386Sopenharmony_ci} 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci} // namespace skgpu 80