blob: ec74b801ec8bcb41b0bb94b70ef58f4d519e092b [file] [log] [blame]
Arun Kumar K.R2b75da32016-11-11 14:37:20 -08001/*
Sushil Chauhan1cc416f2017-01-11 18:09:02 -08002 * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
Arun Kumar K.R2b75da32016-11-11 14:37:20 -08003 * Not a Contribution.
4 *
5 * Copyright 2015 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19#include <utils/Log.h>
20
21#include "EGLImageWrapper.h"
22#include "Tonemapper.h"
23#include "engine.h"
24#include "forward_tonemap.inl"
25#include "fullscreen_vertex_shader.inl"
26#include "rgba_inverse_tonemap.inl"
27
28//-----------------------------------------------------------------------------
29Tonemapper::Tonemapper()
30//-----------------------------------------------------------------------------
31{
32 tonemapTexture = 0;
33 lutXformTexture = 0;
34 programID = 0;
Sushil Chauhan1cc416f2017-01-11 18:09:02 -080035 eglImageWrapper = new EGLImageWrapper();
Arun Kumar K.R2b75da32016-11-11 14:37:20 -080036}
37
38//-----------------------------------------------------------------------------
39Tonemapper::~Tonemapper()
40//-----------------------------------------------------------------------------
41{
Arun Kumar K.R1b04a4e2017-01-23 17:16:55 -080042 engine_bind(engineContext);
Arun Kumar K.R2b75da32016-11-11 14:37:20 -080043 engine_deleteInputBuffer(tonemapTexture);
44 engine_deleteInputBuffer(lutXformTexture);
45 engine_deleteProgram(programID);
Sushil Chauhan1cc416f2017-01-11 18:09:02 -080046
47 // clear EGLImage mappings
48 if (eglImageWrapper != 0) {
Sushil Chauhan1cc416f2017-01-11 18:09:02 -080049 delete eglImageWrapper;
50 eglImageWrapper = 0;
51 }
Arun Kumar K.R1b04a4e2017-01-23 17:16:55 -080052
53 engine_shutdown(engineContext);
Arun Kumar K.R2b75da32016-11-11 14:37:20 -080054}
55
56//-----------------------------------------------------------------------------
57Tonemapper *Tonemapper::build(int type, void *colorMap, int colorMapSize, void *lutXform,
58 int lutXformSize)
59//-----------------------------------------------------------------------------
60{
61 if (colorMapSize <= 0) {
62 ALOGE("Invalid Color Map size = %d", colorMapSize);
63 return NULL;
64 }
Arun Kumar K.R2b75da32016-11-11 14:37:20 -080065
66 // build new tonemapper
67 Tonemapper *tonemapper = new Tonemapper();
Arun Kumar K.R1b04a4e2017-01-23 17:16:55 -080068
69 tonemapper->engineContext = engine_initialize();
70
71 engine_bind(tonemapper->engineContext);
72
Arun Kumar K.R2b75da32016-11-11 14:37:20 -080073 // load the 3d lut
74 tonemapper->tonemapTexture = engine_load3DTexture(colorMap, colorMapSize, 0);
75 // load the non-uniform xform
76 tonemapper->lutXformTexture = engine_load1DTexture(lutXform, lutXformSize, 0);
77 bool bUseXform = (tonemapper->lutXformTexture != 0) && (lutXformSize != 0);
78
79 // create the program
80 const char *fragmentShaders[3];
81 int fragmentShaderCount = 0;
82 const char *version = "#version 300 es\n";
83 const char *define = "#define USE_NONUNIFORM_SAMPLING\n";
84
85 fragmentShaders[fragmentShaderCount++] = version;
86
87 // non-uniform sampling
88 if (bUseXform) {
89 fragmentShaders[fragmentShaderCount++] = define;
90 }
91
92 if (type == TONEMAP_INVERSE) { // inverse tonemapping
93 fragmentShaders[fragmentShaderCount++] = rgba_inverse_tonemap_shader;
94 } else { // forward tonemapping
95 fragmentShaders[fragmentShaderCount++] = forward_tonemap_shader;
96 }
97
98 tonemapper->programID =
99 engine_loadProgram(1, &fullscreen_vertex_shader, fragmentShaderCount, fragmentShaders);
100
101 return tonemapper;
102}
103
104//-----------------------------------------------------------------------------
105int Tonemapper::blit(const void *dst, const void *src, int srcFenceFd)
106//-----------------------------------------------------------------------------
107{
108 // make current
Arun Kumar K.R1b04a4e2017-01-23 17:16:55 -0800109 engine_bind(engineContext);
Arun Kumar K.R2b75da32016-11-11 14:37:20 -0800110
111 // create eglimages if required
Sushil Chauhan1cc416f2017-01-11 18:09:02 -0800112 EGLImageBuffer *dst_buffer = eglImageWrapper->wrap(dst);
113 EGLImageBuffer *src_buffer = eglImageWrapper->wrap(src);
Arun Kumar K.R2b75da32016-11-11 14:37:20 -0800114
115 // bind the program
116 engine_setProgram(programID);
117
118 // set destination
119 engine_setDestination(dst_buffer->getFramebuffer(), 0, 0, dst_buffer->getWidth(),
120 dst_buffer->getHeight());
121 // set source
122 engine_setExternalInputBuffer(0, src_buffer->getTexture());
123 // set 3d lut
124 engine_set3DInputBuffer(1, tonemapTexture);
125 // set non-uniform xform
126 engine_set2DInputBuffer(2, lutXformTexture);
127
128 // perform
129 int fenceFD = engine_blit(srcFenceFd);
130
131 return fenceFD;
132}