165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn/*
265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Copyright (C) 2011 The Android Open Source Project
365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Licensed under the Apache License, Version 2.0 (the "License");
565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * you may not use this file except in compliance with the License.
665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * You may obtain a copy of the License at
765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *      http://www.apache.org/licenses/LICENSE-2.0
965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn *
1065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * Unless required by applicable law or agreed to in writing, software
1165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * distributed under the License is distributed on an "AS IS" BASIS,
1265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * See the License for the specific language governing permissions and
1465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn * limitations under the License.
1565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn */
1665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
1765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <string>
1865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include <vector>
1965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "jni/jni_shader_program.h"
2165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "jni/jni_util.h"
2265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
2365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/base/logging.h"
2465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/geometry.h"
2565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/gl_env.h"
2665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/gl_frame.h"
2765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/shader_program.h"
2865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn#include "native/core/vertex_frame.h"
2965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::GLEnv;
3165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::GLFrame;
3265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::Point;
3365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::ProgramVar;
3465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::Quad;
3565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::ShaderProgram;
3665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennusing android::filterfw::VertexFrame;
3765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
3865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_allocate(JNIEnv* env,
3965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                           jobject thiz,
4065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                           jobject gl_env,
4165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                           jstring vertex_shader,
4265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                           jstring fragment_shader) {
4365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Get the GLEnv pointer
4465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  GLEnv* gl_env_ptr = ConvertFromJava<GLEnv>(env, gl_env);
4565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
4665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  // Create the shader
4765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (!fragment_shader || !gl_env_ptr)
4865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return false;
4965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else if (!vertex_shader)
5065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return ToJBool(WrapObjectInJava(new ShaderProgram(
5165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      gl_env_ptr,
5265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      ToCppString(env, fragment_shader)),
5365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      env,
5465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      thiz,
5565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      true));
5665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  else
5765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return ToJBool(WrapObjectInJava(new ShaderProgram(
5865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      gl_env_ptr,
5965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      ToCppString(env, vertex_shader),
6065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      ToCppString(env, fragment_shader)),
6165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      env,
6265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      thiz,
6365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      true));
6465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
6565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
6665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_deallocate(JNIEnv* env, jobject thiz) {
6765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return ToJBool(DeleteNativeObject<ShaderProgram>(env, thiz));
6865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
6965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_compileAndLink(JNIEnv* env, jobject thiz) {
7165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
7265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return program ? ToJBool(program->CompileAndLink()) : JNI_FALSE;
7365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
7465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
7565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setUniformValue(JNIEnv* env,
7665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jobject thiz,
7765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jstring key,
7865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jobject value) {
7965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
8065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const Value c_value = ToCValue(env, value);
8165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const std::string c_key = ToCppString(env, key);
8265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (c_value.value) {
8365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return ToJBool(program && program->SetUniformValue(c_key, c_value));
8465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  } else {
8565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ALOGE("ShaderProgram: Could not convert java object value passed for key '%s'!", c_key.c_str());
8665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_FALSE;
8765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
8865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
8965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjobject Java_android_filterfw_core_ShaderProgram_getUniformValue(JNIEnv* env,
9165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                 jobject thiz,
9265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                 jstring key) {
9365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
9465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  const std::string c_key = ToCppString(env, key);
9565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return program ? ToJObject(env, program->GetUniformValue(c_key)) : JNI_NULL;
9665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
9765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
9865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_shaderProcess(JNIEnv* env,
9965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                jobject thiz,
10065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                jobjectArray inputs,
10165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                jobject output) {
10265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
10365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  std::vector<const GLFrame*> input_frames;
10465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program && inputs && output) {
10565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the input frames
10665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const int input_count = env->GetArrayLength(inputs);
10765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    for (int i = 0; i < input_count; ++i) {
10865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      jobject input = env->GetObjectArrayElement(inputs, i);
10965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      const GLFrame* input_frame = ConvertFromJava<GLFrame>(env, input);
11065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      if (!input || !input_frame) {
11165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        ALOGE("ShaderProgram: invalid input frame %d!", i);
11265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn        return JNI_FALSE;
11365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      }
11465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      input_frames.push_back(input_frame);
11565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
11665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
11765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the output frame
11865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    GLFrame* output_frame = ConvertFromJava<GLFrame>(env, output);
11965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    if (!output_frame) {
12065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      ALOGE("ShaderProgram: no output frame found!");
12165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return JNI_FALSE;
12265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
12465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Process the frames!
12565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    if (!program->Process(input_frames, output_frame)) {
12665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      ALOGE("ShaderProgram: error processing shader!");
12765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return JNI_FALSE;
12865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
12965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
13165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
13265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
13365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
13465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
13565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjobject Java_android_filterfw_core_ShaderProgram_nativeCreateIdentity(JNIEnv* env,
13665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jclass,
13765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jobject gl_env) {
13865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  GLEnv* gl_env_ptr = ConvertFromJava<GLEnv>(env, gl_env);
13965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = gl_env_ptr ? ShaderProgram::CreateIdentity(gl_env_ptr) : NULL;
14065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return program ? WrapNewObjectInJava(program, env, false) : NULL;
14165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
14265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
14365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setSourceRegion(JNIEnv* env,
14465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jobject thiz,
14565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x0,
14665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y0,
14765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x1,
14865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y1,
14965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x2,
15065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y2,
15165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x3,
15265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y3) {
15365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
15465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
15565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetSourceRegion(Quad(Point(x0, y0), Point(x1, y1), Point(x2, y2), Point(x3, y3)));
15665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
15765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
15865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
15965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
16065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
16165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setTargetRegion(JNIEnv* env,
16265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jobject thiz,
16365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x0,
16465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y0,
16565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x1,
16665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y1,
16765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x2,
16865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y2,
16965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat x3,
17065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                  jfloat y3) {
17165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
17265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
17365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetTargetRegion(Quad(Point(x0, y0), Point(x1, y1), Point(x2, y2), Point(x3, y3)));
17465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
17565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
17665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
17765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
17865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
17965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderClearsOutput(JNIEnv* env,
18065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                        jobject thiz,
18165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                        jboolean clears) {
18265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
18365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
18465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetClearsOutput(ToCppBool(clears));
18565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
18665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
18765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
18865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
18965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
19065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderBlendEnabled(JNIEnv* env,
19165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                        jobject thiz,
19265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                        jboolean enable) {
19365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
19465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
19565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetBlendEnabled(ToCppBool(enable));
19665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
19765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
19865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
19965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
20065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
20165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderBlendFunc(JNIEnv* env,
20265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                     jobject thiz,
20365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                     jint sfactor,
20465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                     jint dfactor) {
20565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
20665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
20765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetBlendFunc(sfactor, dfactor);
20865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
20965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
21065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
21165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
21265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
21365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderClearColor(JNIEnv* env,
21465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jobject thiz,
21565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jfloat r,
21665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jfloat g,
21765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jfloat b) {
21865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
21965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
22065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetClearColor(r, g, b, 1.0f);
22165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
22265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
22365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
22465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
22565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
22665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderDrawMode(JNIEnv* env,
22765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                    jobject thiz,
22865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                    jint draw_mode) {
22965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
23065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
23165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetDrawMode(draw_mode);
23265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
23365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
23465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
23565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
23665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
23765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderTileCounts(JNIEnv* env,
23865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jobject thiz,
23965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jint x_count,
24065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                      jint y_count) {
24165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
24265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
24365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetTileCounts(x_count, y_count);
24465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
24565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
24665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
24765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
24865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
24965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderVertexCount(JNIEnv* env,
25065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                       jobject thiz,
25165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                                       jint vertex_count) {
25265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
25365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
25465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    program->SetVertexCount(vertex_count);
25565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return JNI_TRUE;
25665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
25765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
25865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
25965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
26065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_beginShaderDrawing(JNIEnv* env, jobject thiz) {
26165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
26265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    return ToJBool(program && program->BeginDraw());
26365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
26465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
26565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderAttributeValues(
26665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    JNIEnv* env,
26765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jobject thiz,
26865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jstring attr_name,
26965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jfloatArray values,
27065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jint component_count) {
27165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
27265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
27365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the floats to set
27465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jfloat* float_ptr = env->GetFloatArrayElements(values, NULL);
27565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const int length = env->GetArrayLength(values);
27665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
27765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the program variable to set
27865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const std::string attr_string = ToCppString(env, attr_name);
27965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ProgramVar program_var = program->GetAttribute(attr_string);
28065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
28165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set the variable
28265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    if (float_ptr && ShaderProgram::IsVarValid(program_var)) {
28365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      const bool success = program->SetAttributeValues(program_var,
28465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       reinterpret_cast<float*>(float_ptr),
28565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       length,
28665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       component_count);
28765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      env->ReleaseFloatArrayElements(values, float_ptr, JNI_ABORT);
28865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return ToJBool(success);
28965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
29065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
29165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
29265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
29365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
29465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Rennjboolean Java_android_filterfw_core_ShaderProgram_setShaderAttributeVertexFrame(
29565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    JNIEnv* env,
29665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jobject thiz,
29765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jstring attr_name,
29865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jobject vertex_frame,
29965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jint type,
30065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jint component_count,
30165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jint stride,
30265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jint offset,
30365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    jboolean normalize) {
30465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  ShaderProgram* program = ConvertFromJava<ShaderProgram>(env, thiz);
30565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  if (program) {
30665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the vertex frame
30765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    VertexFrame* v_frame = ConvertFromJava<VertexFrame>(env, vertex_frame);
30865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
30965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Get the program variable to set
31065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    const std::string attr_string = ToCppString(env, attr_name);
31165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    ProgramVar program_var = program->GetAttribute(attr_string);
31265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn
31365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    // Set the variable
31465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    if (v_frame && ShaderProgram::IsVarValid(program_var)) {
31565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      const bool success = program->SetAttributeValues(program_var,
31665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       v_frame,
31765953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       type,
31865953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       component_count,
31965953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       stride,
32065953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       offset,
32165953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn                                                       ToCppBool(normalize));
32265953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn      return ToJBool(success);
32365953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn    }
32465953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  }
32565953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn  return JNI_FALSE;
32665953da4636fbf5f0a24b8f5f2b5fa7d76ff13d9Marius Renn}
327