1ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy/*
2ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Copyright (C) 2010 The Android Open Source Project
3ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy *
4ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * you may not use this file except in compliance with the License.
6ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * You may obtain a copy of the License at
7ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy *
8ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy *
10ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Unless required by applicable law or agreed to in writing, software
11ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * See the License for the specific language governing permissions and
14ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * limitations under the License.
15ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */
16ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_PROGRAM_CACHE_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_PROGRAM_CACHE_H
19ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
20ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy#include <utils/KeyedVector.h>
21ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy#include <utils/Log.h>
2206f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <utils/String8.h>
23ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
24889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy#include <GLES2/gl2.h>
25889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy
26c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include "Debug.h"
27ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy#include "Program.h"
2824edca8b526515979778e577191089a57f5277d7Romain Guy#include "Properties.h"
29ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
30ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guynamespace android {
31ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guynamespace uirenderer {
32ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
33ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy///////////////////////////////////////////////////////////////////////////////
34ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy// Cache
35ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy///////////////////////////////////////////////////////////////////////////////
36ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
37ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy/**
38ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * Generates and caches program. Programs are generated based on
39ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy * ProgramDescriptions.
40ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy */
41ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guyclass ProgramCache {
42ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guypublic:
43ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    ProgramCache();
44ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    ~ProgramCache();
45ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
46ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    Program* get(const ProgramDescription& description);
47ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
48ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    void clear();
49ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
50ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guyprivate:
51ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    Program* generateProgram(const ProgramDescription& description, programid key);
52ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    String8 generateVertexShader(const ProgramDescription& description);
53ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    String8 generateFragmentShader(const ProgramDescription& description);
5448daa54d31fc59ec969dcff65eb3cbb0ce879a8dRomain Guy    void generateBlend(String8& shader, const char* name, SkXfermode::Mode mode);
55889f8d1403761d5668115ced6cbb3f767cfe966dRomain Guy    void generateTextureWrap(String8& shader, GLenum wrapS, GLenum wrapT);
56ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
57db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy    void printLongString(const String8& shader) const;
58db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
59ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy    KeyedVector<programid, Program*> mCache;
60b48800428906ae455c2b63acacd44e390e1fee49Romain Guy
61b48800428906ae455c2b63acacd44e390e1fee49Romain Guy    const bool mHasES3;
62ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy}; // class ProgramCache
63ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
64ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy}; // namespace uirenderer
65ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy}; // namespace android
66ac670c0433d19397d4e36ced2110475b6f54fe26Romain Guy
675b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_PROGRAM_CACHE_H
68