@@ -111,6 +111,9 @@ int DebayerEGL::getShaderVariableLocations(void)
textureUniformBayerFirstRed_ = glGetUniformLocation(programId_, "tex_bayer_first_red");
textureUniformProjMatrix_ = glGetUniformLocation(programId_, "proj_matrix");
+ if (lscEnabled_)
+ textureUniformLsc_ = glGetUniformLocation(programId_, "lsc_tex");
+
LOG(Debayer, Debug) << "vertexIn " << attributeVertex_ << " textureIn " << attributeTexture_
<< " tex_y " << textureUniformBayerDataIn_
<< " ccm " << ccmUniformDataIn_
@@ -121,7 +124,8 @@ int DebayerEGL::getShaderVariableLocations(void)
<< " tex_size " << textureUniformSize_
<< " stride_factor " << textureUniformStrideFactor_
<< " tex_bayer_first_red " << textureUniformBayerFirstRed_
- << " proj_matrix " << textureUniformProjMatrix_;
+ << " proj_matrix " << textureUniformProjMatrix_
+ << " lsc " << (lscEnabled_ ? textureUniformLsc_ : -1);
return 0;
}
@@ -140,6 +144,9 @@ int DebayerEGL::initBayerShaders(PixelFormat inputFormat, PixelFormat outputForm
/* Specify GL_OES_EGL_image_external */
egl_.pushEnv(shaderEnv, "#extension GL_OES_EGL_image_external: enable");
+ if (lscEnabled_)
+ egl_.pushEnv(shaderEnv, "#define DO_LSC");
+
/*
* Tell shaders how to re-order output taking account of how the pixels
* are actually stored by EGL.
@@ -339,6 +346,12 @@ int DebayerEGL::configure(const StreamConfiguration &inputCfg,
*/
stats_->setWindow(Rectangle(window_.size()));
+ if (lscEnabled_) {
+ constexpr unsigned int gridSize = DebayerParams::kLscGridSize;
+ eglImageLscLookup_ =
+ std::make_unique<eGLImage>(gridSize, gridSize, gridSize * 3, GL_TEXTURE2, 2);
+ }
+
return 0;
}
@@ -478,6 +491,13 @@ void DebayerEGL::setShaderVariableValues(const DebayerParams ¶ms)
glUniformMatrix3fv(ccmUniformDataIn_, 1, GL_FALSE, ccm);
LOG(Debayer, Debug) << " ccmUniformDataIn_ " << ccmUniformDataIn_ << " data " << params.combinedMatrix;
+ if (lscEnabled_) {
+ egl_.createTexture2D(*eglImageLscLookup_, GL_RGB,
+ DebayerParams::kLscGridSize, DebayerParams::kLscGridSize,
+ params.lscLut.data(), GL_LINEAR);
+ glUniform1i(textureUniformLsc_, eglImageLscLookup_->texture_unit_uniform_id_);
+ }
+
/*
* 0 = Red, 1 = Green, 2 = Blue
*/
@@ -85,7 +85,10 @@ private:
std::unique_ptr<eGLImage> eglImageBayerIn_;
std::unique_ptr<eGLImage> eglImageBayerOut_;
+ /* LSC lookup table */
+ std::unique_ptr<eGLImage> eglImageLscLookup_;
bool lscEnabled_;
+
/* Shader parameters */
float firstRed_x_;
float firstRed_y_;
@@ -99,6 +102,8 @@ private:
GLint textureUniformBayerDataIn_;
+ GLint textureUniformLsc_;
+
/* Represent per-frame CCM as a uniform vector of floats 3 x 3 */
GLint ccmUniformDataIn_;