blob: 2c00fdf1588ff39554018cf3f5ad0cbe2bba45fd [file] [log] [blame]
junov@google.comf93e7172011-03-31 21:26:24 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 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.
junov@google.comf93e7172011-03-31 21:26:24 +00006 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "src/gpu/gl/GrGLGpu.h"
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/gpu/GrProcessor.h"
11#include "src/gpu/GrProgramDesc.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "src/gpu/gl/builders/GrGLProgramBuilder.h"
13#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
bsalomon@google.comdbbc4e22012-07-25 17:48:39 +000014
bsalomon861e1032014-12-16 07:33:49 -080015struct GrGLGpu::ProgramCache::Entry {
Robert Phillips752e08b2018-06-22 09:48:38 -040016 Entry(sk_sp<GrGLProgram> program) : fProgram(std::move(program)) {}
halcanary9d524f22016-03-29 09:03:52 -070017
Ethan Nicholas1b9924f2016-12-15 15:28:42 -050018 sk_sp<GrGLProgram> fProgram;
bsalomon@google.com2db3ded2013-05-22 14:34:04 +000019};
junov@google.comf93e7172011-03-31 21:26:24 +000020
bsalomon861e1032014-12-16 07:33:49 -080021GrGLGpu::ProgramCache::ProgramCache(GrGLGpu* gpu)
Ethan Nicholas1b9924f2016-12-15 15:28:42 -050022 : fMap(kMaxEntries)
Brian Osmane9d9a322019-09-03 13:59:36 -040023 , fGpu(gpu) {}
jvanverth@google.com94878772013-03-12 16:00:54 +000024
Brian Osmane9d9a322019-09-03 13:59:36 -040025GrGLGpu::ProgramCache::~ProgramCache() {}
junov@google.comf93e7172011-03-31 21:26:24 +000026
egdaniel22281c12016-03-23 13:49:40 -070027void GrGLGpu::ProgramCache::abandon() {
Brian Osman0b8bb882019-04-12 11:47:19 -040028 fMap.foreach([](std::unique_ptr<Entry>* e) {
29 (*e)->fProgram->abandon();
30 });
31
32 this->reset();
33}
34
35void GrGLGpu::ProgramCache::reset() {
Robert Phillips752e08b2018-06-22 09:48:38 -040036 fMap.reset();
joshualitt8fd844f2015-12-02 13:36:47 -080037}
38
Greg Daniel7a82edf2018-12-04 10:54:34 -050039GrGLProgram* GrGLGpu::ProgramCache::refProgram(GrGLGpu* gpu,
Robert Phillipsd0fe8752019-01-31 14:13:59 -050040 GrRenderTarget* renderTarget,
41 GrSurfaceOrigin origin,
bsalomon2eda5b32016-09-21 10:53:24 -070042 const GrPrimitiveProcessor& primProc,
Greg Daniel9a51a862018-11-30 10:18:14 -050043 const GrTextureProxy* const primProcProxies[],
Brian Salomonff168d92018-06-23 15:17:27 -040044 const GrPipeline& pipeline,
bsalomon2eda5b32016-09-21 10:53:24 -070045 bool isPoints) {
egdaniel0e1853c2016-03-17 11:35:45 -070046 // Get GrGLProgramDesc
egdaniel5d8f69f2016-09-07 07:24:12 -070047 GrProgramDesc desc;
Chris Daltond7291ba2019-03-07 14:17:03 -070048 if (!GrProgramDesc::Build(&desc, renderTarget, primProc, isPoints, pipeline, gpu)) {
egdaniel0e1853c2016-03-17 11:35:45 -070049 GrCapsDebugf(gpu->caps(), "Failed to gl program descriptor!\n");
50 return nullptr;
51 }
Brian Osmane11dfd32019-07-23 10:29:41 -040052 // If we knew the shader won't depend on origin, we could skip this (and use the same program
53 // for both origins). Instrumenting all fragment processors would be difficult and error prone.
54 desc.setSurfaceOriginKey(GrGLSLFragmentShaderBuilder::KeyForSurfaceOrigin(origin));
55
Ethan Nicholas1b9924f2016-12-15 15:28:42 -050056 std::unique_ptr<Entry>* entry = fMap.find(desc);
57 if (!entry) {
bsalomon@google.com2db3ded2013-05-22 14:34:04 +000058 // We have a cache miss
Robert Phillipsd0fe8752019-01-31 14:13:59 -050059 GrGLProgram* program = GrGLProgramBuilder::CreateProgram(renderTarget, origin,
60 primProc, primProcProxies,
Greg Daniel9a51a862018-11-30 10:18:14 -050061 pipeline, &desc, fGpu);
halcanary96fcdcc2015-08-27 07:41:13 -070062 if (nullptr == program) {
63 return nullptr;
bsalomon@google.comc1d2a582012-06-01 15:08:19 +000064 }
Ethan Nicholas1b9924f2016-12-15 15:28:42 -050065 entry = fMap.insert(desc, std::unique_ptr<Entry>(new Entry(sk_sp<GrGLProgram>(program))));
junov@google.comf93e7172011-03-31 21:26:24 +000066 }
bsalomon@google.comc1d2a582012-06-01 15:08:19 +000067
Ethan Nicholas1b9924f2016-12-15 15:28:42 -050068 return SkRef((*entry)->fProgram.get());
bsalomon@google.comc1d2a582012-06-01 15:08:19 +000069}