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