aboutsummaryrefslogtreecommitdiff
path: root/modules/gles/gl_image_shader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gles/gl_image_shader.cpp')
-rw-r--r--modules/gles/gl_image_shader.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/modules/gles/gl_image_shader.cpp b/modules/gles/gl_image_shader.cpp
new file mode 100644
index 0000000..3b1a92f
--- /dev/null
+++ b/modules/gles/gl_image_shader.cpp
@@ -0,0 +1,191 @@
+/*
+ * gl_image_shader.cpp - gl image shader implementation
+ *
+ * Copyright (c) 2018 Intel Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Author: Yinhang Liu <yinhangx.liu@intel.com>
+ */
+
+#include "gl_image_shader.h"
+
+#define ENABLE_DEBUG_SHADER 0
+
+namespace XCam {
+
+GLImageShader::GLImageShader (const char *name, const SmartPtr<Callback> &cb)
+ : Worker (name, cb)
+{
+ XCAM_OBJ_PROFILING_INIT;
+}
+
+GLImageShader::~GLImageShader ()
+{
+}
+
+XCamReturn
+GLImageShader::finish ()
+{
+ _program->finish ();
+ return XCAM_RETURN_NO_ERROR;
+}
+
+XCamReturn
+GLImageShader::stop ()
+{
+ return XCAM_RETURN_NO_ERROR;
+}
+
+bool
+GLImageShader::get_compute_program (SmartPtr<GLComputeProgram> &prog)
+{
+ prog = _program.dynamic_cast_ptr<GLComputeProgram> ();
+ XCAM_FAIL_RETURN (
+ ERROR, prog.ptr (), false,
+ "GLImageShader(%s) convert to GLComputeProgram failed", XCAM_STR (get_name ()));
+
+ return true;
+}
+
+XCamReturn
+GLImageShader::work (const SmartPtr<Worker::Arguments> &args)
+{
+ XCamReturn ret = _program->use ();
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) use program failed", XCAM_STR (get_name ()));
+
+ ret = pre_work (args);
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) pre-work failed", XCAM_STR (get_name ()));
+
+#if ENABLE_DEBUG_SHADER
+ XCAM_OBJ_PROFILING_START;
+#endif
+
+ ret = _program->work ();
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) work failed", XCAM_STR (get_name ()));
+
+#if ENABLE_DEBUG_SHADER
+ ret = _program->finish ();
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) finish failed", XCAM_STR (get_name ()));
+
+ char name[XCAM_GL_NAME_LENGTH] = {'\0'};
+ snprintf (name, sizeof (name), "%s-%p", XCAM_STR (get_name ()), this);
+ XCAM_OBJ_PROFILING_END (name, XCAM_OBJ_DUR_FRAME_NUM);
+#endif
+
+ ret = _program->disuse ();
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) disuse program failed", XCAM_STR (get_name ()));
+
+ status_check (args, ret);
+
+ return XCAM_RETURN_NO_ERROR;
+}
+
+XCamReturn
+GLImageShader::pre_work (const SmartPtr<Worker::Arguments> &args)
+{
+ GLCmdList cmds;
+
+ XCamReturn ret = prepare_arguments (args, cmds);
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) prepare arguments failed", XCAM_STR (get_name ()));
+
+ ret = set_commands (cmds);
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) set commands failed", XCAM_STR (get_name ()));
+
+ return ret;
+}
+XCamReturn
+GLImageShader::prepare_arguments (const SmartPtr<Worker::Arguments> &args, GLCmdList &cmds)
+{
+ XCAM_UNUSED (args);
+ XCAM_UNUSED (cmds);
+
+ XCAM_LOG_ERROR ("GLImageShader(%s) prepare arguments error", XCAM_STR (get_name ()));
+ return XCAM_RETURN_ERROR_GLES;
+}
+
+XCamReturn
+GLImageShader::set_commands (const GLCmdList &cmds)
+{
+ GLuint prog_id = _program->get_program_id();
+ XCAM_FAIL_RETURN (
+ WARNING, prog_id, XCAM_RETURN_ERROR_PARAM,
+ "GLImageShader(%s) invalid program id:%d", XCAM_STR (get_name ()), prog_id);
+
+ uint32_t i_count = 0;
+ for (GLCmdList::const_iterator iter = cmds.begin (); iter != cmds.end (); ++iter, ++i_count) {
+ const SmartPtr<GLCommand> &cmd = *iter;
+ XCAM_FAIL_RETURN (
+ WARNING, cmd.ptr (), XCAM_RETURN_ERROR_MEM,
+ "GLImageShader(%s) command(idx:%d) is NULL", XCAM_STR (get_name ()), i_count);
+
+ XCamReturn ret = cmd->run (prog_id);
+ XCAM_FAIL_RETURN (
+ WARNING, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) command(idx:%d) run failed", XCAM_STR (get_name ()));
+ }
+
+ return XCAM_RETURN_NO_ERROR;
+}
+
+XCamReturn
+GLImageShader::create_compute_program (const GLShaderInfo &info, const char *name)
+{
+ SmartPtr<GLComputeProgram> program = GLComputeProgram::create_compute_program (name);
+ XCAM_FAIL_RETURN (
+ ERROR, program.ptr (), XCAM_RETURN_ERROR_GLES,
+ "GLImageShader(%s) create compute program(%s) failed", XCAM_STR (get_name ()), XCAM_STR (name));
+
+ XCamReturn ret = program->link_shader (info);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) program(%s) pour shader failed", XCAM_STR (get_name ()), XCAM_STR (name));
+
+ _program = program;
+
+ return XCAM_RETURN_NO_ERROR;
+}
+
+XCamReturn
+GLImageShader::create_compute_program (const GLShaderInfoList &infos, const char *name)
+{
+ SmartPtr<GLComputeProgram> program = GLComputeProgram::create_compute_program (name);
+ XCAM_FAIL_RETURN (
+ ERROR, program.ptr (), XCAM_RETURN_ERROR_GLES,
+ "GLImageShader(%s) create compute program(%s) failed", XCAM_STR (get_name ()), XCAM_STR (name));
+
+ XCamReturn ret = program->link_shaders (infos);
+ XCAM_FAIL_RETURN (
+ ERROR, ret == XCAM_RETURN_NO_ERROR, ret,
+ "GLImageShader(%s) program(%s) pour shaders failed", XCAM_STR (get_name ()), XCAM_STR (name));
+
+ _program = program;
+
+ return XCAM_RETURN_NO_ERROR;
+}
+
+};