Rename ioReceive and ioSend
First checkin of Allocation IO test
Change-Id: I26379e442796caab95a089dbb42b02192f4cc563
diff --git a/tests/RenderScriptTests/SurfaceTexture/Android.mk b/tests/RenderScriptTests/SurfaceTexture/Android.mk
new file mode 100644
index 0000000..bbd4d55
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/Android.mk
@@ -0,0 +1,29 @@
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-renderscript-files-under, src)
+
+# TODO: build fails with this set
+# LOCAL_SDK_VERSION := current
+
+LOCAL_PACKAGE_NAME := RsSurfaceTextureOpaque
+
+include $(BUILD_PACKAGE)
diff --git a/tests/RenderScriptTests/SurfaceTexture/AndroidManifest.xml b/tests/RenderScriptTests/SurfaceTexture/AndroidManifest.xml
new file mode 100644
index 0000000..8aaa239
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.example.android.rs.sto">
+ <uses-sdk android:minSdkVersion="14" />
+ <uses-permission android:name="android.permission.CAMERA" />
+ <uses-feature android:name="android.hardware.camera" />
+ <uses-feature android:name="android.hardware.camera.autofocus" />
+
+ <application
+ android:label="RsSurfaceTextureOpaque"
+ android:hardwareAccelerated="true"
+ android:icon="@drawable/test_pattern">
+
+ <activity android:name="SurfaceTextureOpaque">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/RenderScriptTests/SurfaceTexture/res/drawable/test_pattern.png b/tests/RenderScriptTests/SurfaceTexture/res/drawable/test_pattern.png
new file mode 100644
index 0000000..e7d1455
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/res/drawable/test_pattern.png
Binary files differ
diff --git a/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/CameraCapture.java b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/CameraCapture.java
new file mode 100644
index 0000000..afdab41
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/CameraCapture.java
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+
+package com.example.android.rs.sto;
+
+import android.graphics.SurfaceTexture;
+import android.hardware.Camera;
+import android.os.SystemClock;
+import android.util.Log;
+
+import java.io.IOException;
+import java.util.List;
+
+public class CameraCapture {
+
+ public interface CameraFrameListener {
+ public void onNewCameraFrame();
+ }
+
+ static final int FRAMES_PER_SEC = 30;
+
+ private Camera mCamera;
+ private SurfaceTexture mSurfaceTexture;
+
+ private int mProgram;
+
+ private int mCameraTransformHandle;
+ private int mTexSamplerHandle;
+ private int mTexCoordHandle;
+ private int mPosCoordHandle;
+
+ private float[] mCameraTransform = new float[16];
+
+ private int mCameraId = 0;
+ private int mWidth;
+ private int mHeight;
+
+ private long mStartCaptureTime = 0;
+
+ private boolean mNewFrameAvailable = false;
+ private boolean mIsOpen = false;
+
+ private CameraFrameListener mListener;
+
+ public synchronized void beginCapture(int cameraId, int width, int height,
+ SurfaceTexture st) {
+ mCameraId = cameraId;
+ mSurfaceTexture = st;
+
+ // Open the camera
+ openCamera(width, height);
+
+ // Start the camera
+ mStartCaptureTime = SystemClock.elapsedRealtime();
+ mCamera.startPreview();
+ mIsOpen = true;
+ }
+
+ public void getCurrentFrame() {
+ if (checkNewFrame()) {
+ if (mStartCaptureTime > 0 && SystemClock.elapsedRealtime() - mStartCaptureTime > 2000) {
+ // Lock white-balance and exposure for effects
+ Log.i("CC", "Locking white-balance and exposure!");
+ Camera.Parameters params = mCamera.getParameters();
+ params.setAutoWhiteBalanceLock(true);
+ params.setAutoExposureLock(true);
+ //mCamera.setParameters(params);
+ mStartCaptureTime = 0;
+ }
+
+ mSurfaceTexture.updateTexImage();
+ mSurfaceTexture.getTransformMatrix(mCameraTransform);
+
+ // display it here
+ }
+ }
+
+ public synchronized boolean hasNewFrame() {
+ return mNewFrameAvailable;
+ }
+
+ public synchronized void endCapture() {
+ mIsOpen = false;
+ if (mCamera != null) {
+ mCamera.release();
+ mCamera = null;
+ mSurfaceTexture = null;
+ }
+ }
+
+ public synchronized boolean isOpen() {
+ return mIsOpen;
+ }
+
+ public int getWidth() {
+ return mWidth;
+ }
+
+ public int getHeight() {
+ return mHeight;
+ }
+
+ public void setCameraFrameListener(CameraFrameListener listener) {
+ mListener = listener;
+ }
+
+ private void openCamera(int width, int height) {
+ // Setup camera
+ mCamera = Camera.open(mCameraId);
+ mCamera.setParameters(calcCameraParameters(width, height));
+
+ // Create camera surface texture
+ try {
+ mCamera.setPreviewTexture(mSurfaceTexture);
+ } catch (IOException e) {
+ throw new RuntimeException("Could not bind camera surface texture: " +
+ e.getMessage() + "!");
+ }
+
+ // Connect SurfaceTexture to callback
+ mSurfaceTexture.setOnFrameAvailableListener(onCameraFrameAvailableListener);
+ }
+
+ private Camera.Parameters calcCameraParameters(int width, int height) {
+ Camera.Parameters params = mCamera.getParameters();
+ params.setPreviewSize(mWidth, mHeight);
+
+ // Find closest size
+ int closestSize[] = findClosestSize(width, height, params);
+ mWidth = closestSize[0];
+ mHeight = closestSize[1];
+ params.setPreviewSize(mWidth, mHeight);
+
+ // Find closest FPS
+ int closestRange[] = findClosestFpsRange(FRAMES_PER_SEC, params);
+
+ params.setPreviewFpsRange(closestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
+ closestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+
+ return params;
+ }
+
+ private int[] findClosestSize(int width, int height, Camera.Parameters parameters) {
+ List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
+ int closestWidth = -1;
+ int closestHeight = -1;
+ int smallestWidth = previewSizes.get(0).width;
+ int smallestHeight = previewSizes.get(0).height;
+ for (Camera.Size size : previewSizes) {
+ // Best match defined as not being larger in either dimension than
+ // the requested size, but as close as possible. The below isn't a
+ // stable selection (reording the size list can give different
+ // results), but since this is a fallback nicety, that's acceptable.
+ if ( size.width <= width &&
+ size.height <= height &&
+ size.width >= closestWidth &&
+ size.height >= closestHeight) {
+ closestWidth = size.width;
+ closestHeight = size.height;
+ }
+ if ( size.width < smallestWidth &&
+ size.height < smallestHeight) {
+ smallestWidth = size.width;
+ smallestHeight = size.height;
+ }
+ }
+ if (closestWidth == -1) {
+ // Requested size is smaller than any listed size; match with smallest possible
+ closestWidth = smallestWidth;
+ closestHeight = smallestHeight;
+ }
+ int[] closestSize = {closestWidth, closestHeight};
+ return closestSize;
+ }
+
+ private int[] findClosestFpsRange(int fps, Camera.Parameters params) {
+ List<int[]> supportedFpsRanges = params.getSupportedPreviewFpsRange();
+ int[] closestRange = supportedFpsRanges.get(0);
+ int fpsk = fps * 1000;
+ int minDiff = 1000000;
+ for (int[] range : supportedFpsRanges) {
+ int low = range[Camera.Parameters.PREVIEW_FPS_MIN_INDEX];
+ int high = range[Camera.Parameters.PREVIEW_FPS_MAX_INDEX];
+ if (low <= fpsk && high >= fpsk) {
+ int diff = (fpsk - low) + (high - fpsk);
+ if (diff < minDiff) {
+ closestRange = range;
+ minDiff = diff;
+ }
+ }
+ }
+ Log.i("CC", "Found closest range: "
+ + closestRange[Camera.Parameters.PREVIEW_FPS_MIN_INDEX] + " - "
+ + closestRange[Camera.Parameters.PREVIEW_FPS_MAX_INDEX]);
+ return closestRange;
+ }
+
+ private synchronized void signalNewFrame() {
+ mNewFrameAvailable = true;
+ if (mListener != null) {
+ mListener.onNewCameraFrame();
+ }
+ }
+
+ private synchronized boolean checkNewFrame() {
+ if (mNewFrameAvailable) {
+ mNewFrameAvailable = false;
+ return true;
+ }
+ return false;
+ }
+
+ private SurfaceTexture.OnFrameAvailableListener onCameraFrameAvailableListener =
+ new SurfaceTexture.OnFrameAvailableListener() {
+ @Override
+ public void onFrameAvailable(SurfaceTexture surfaceTexture) {
+ signalNewFrame();
+ }
+ };
+}
diff --git a/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaque.java b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaque.java
new file mode 100644
index 0000000..a51edaa
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaque.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.example.android.rs.sto;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.provider.Settings.System;
+import android.util.Log;
+import android.view.View;
+import android.graphics.SurfaceTexture;
+
+import java.lang.Runtime;
+
+public class SurfaceTextureOpaque extends Activity {
+ private SurfaceTextureOpaqueView mView;
+ CameraCapture mCC;
+
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+
+ mView = new SurfaceTextureOpaqueView(this);
+ setContentView(mView);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ mView.resume();
+ startCamera();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ mView.pause();
+ mCC.endCapture();
+ }
+
+ cfl mCFL;
+ public void startCamera() {
+ mCC = new CameraCapture();
+ mCFL = new cfl();
+
+ mCC.setCameraFrameListener(mCFL);
+
+ mCC.beginCapture(1, 640, 480, mView.getST());
+ }
+
+ public class cfl implements CameraCapture.CameraFrameListener {
+ public void onNewCameraFrame() {
+ mView.mRender.newFrame();
+ }
+ }
+
+}
+
diff --git a/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueRS.java b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueRS.java
new file mode 100644
index 0000000..b638b7d
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueRS.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.example.android.rs.sto;
+
+import android.content.res.Resources;
+import android.renderscript.*;
+import android.graphics.SurfaceTexture;
+import android.util.Log;
+
+
+public class SurfaceTextureOpaqueRS {
+ static final private int NUM_CAMERA_PREVIEW_BUFFERS = 2;
+
+ public SurfaceTextureOpaqueRS() {
+ }
+
+ private Resources mRes;
+ private RenderScriptGL mRS;
+ private ScriptC_sto mScript;
+ private SurfaceTexture mST;
+ private Allocation mSto;
+ private Allocation mSto2;
+ private Allocation mRto;
+ private ProgramFragment mPF;
+
+ public void init(RenderScriptGL rs, Resources res) {
+ mRS = rs;
+ mRes = res;
+
+ Type.Builder tb = new Type.Builder(mRS, Element.RGBA_8888(mRS));
+ tb.setX(640);
+ tb.setY(480);
+ mSto = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_GRAPHICS_TEXTURE |
+ Allocation.USAGE_IO_INPUT);
+ mRto = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_GRAPHICS_RENDER_TARGET |
+ Allocation.USAGE_IO_OUTPUT);
+ mSto2 = Allocation.createTyped(mRS, tb.create(), Allocation.USAGE_GRAPHICS_TEXTURE |
+ Allocation.USAGE_IO_INPUT);
+ mST = mSto.getSurfaceTexture();
+ mRto.setSurfaceTexture(mSto2.getSurfaceTexture());
+
+ ProgramFragmentFixedFunction.Builder pfb = new ProgramFragmentFixedFunction.Builder(rs);
+ pfb.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
+ ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
+ mPF = pfb.create();
+ mPF.bindSampler(Sampler.CLAMP_NEAREST(mRS), 0);
+ rs.bindProgramFragment(mPF);
+
+ mScript = new ScriptC_sto(mRS, mRes, R.raw.sto);
+ mScript.set_sto(mSto);
+ mScript.set_rto(mRto);
+ mScript.set_sto2(mSto2);
+ mScript.set_pf(mPF);
+
+ mRS.bindRootScript(mScript);
+
+
+ android.util.Log.v("sto", "Init complete");
+ }
+
+ SurfaceTexture getST() {
+ return mST;
+ }
+
+ public void newFrame() {
+ mSto.ioReceive();
+ }
+
+}
diff --git a/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueView.java b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueView.java
new file mode 100644
index 0000000..f5e49f2
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/SurfaceTextureOpaqueView.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+package com.example.android.rs.sto;
+
+
+import android.renderscript.RSSurfaceView;
+import android.renderscript.RenderScriptGL;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.SurfaceTexture;
+import android.util.Log;
+
+public class SurfaceTextureOpaqueView extends RSSurfaceView {
+
+ public SurfaceTextureOpaqueView(Context context) {
+ super(context);
+ }
+
+ RenderScriptGL mRS;
+ SurfaceTextureOpaqueRS mRender;
+
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ if (mRS != null) {
+ mRS = null;
+ destroyRenderScriptGL();
+ }
+ }
+
+ SurfaceTexture getST() {
+ RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
+ mRS = createRenderScriptGL(sc);
+ mRender = new SurfaceTextureOpaqueRS();
+ mRender.init(mRS, getResources());
+ return mRender.getST();
+ }
+
+}
+
+
diff --git a/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/sto.rs b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/sto.rs
new file mode 100644
index 0000000..efa901a
--- /dev/null
+++ b/tests/RenderScriptTests/SurfaceTexture/src/com/example/android/rs/sto/sto.rs
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#pragma version(1)
+#pragma rs java_package_name(com.example.android.rs.sto)
+
+#pragma stateFragment(parent)
+
+#include "rs_graphics.rsh"
+
+
+rs_program_fragment pf;
+rs_allocation sto; // camera in
+rs_allocation sto2;
+rs_allocation rto; // render target
+
+int root() {
+ rsgBindTexture(pf, 0, sto);
+
+#if 1
+ rsgBindColorTarget(rto, 0);
+
+ rsgClearColor(0.f, 1.f, 0.f, 1.f);
+ rsgDrawQuadTexCoords(0, 0, 0, 0,0,
+ 0,500,0, 1,0,
+ 500,500,0, 1, 1,
+ 500, 0, 0, 0, 1 );
+ rsgClearColorTarget(0);
+
+ // io ops
+ rsAllocationIoSend(rto);
+ rsAllocationIoReceive(sto2);
+
+ rsgBindTexture(pf, 0, sto2);
+#endif
+
+ rsgClearColor(0.f, 1.f, 0.f, 1.f);
+ rsgDrawQuadTexCoords(0, 0, 0, 0,0,
+ 0,500,0, 1,0,
+ 500,500,0, 1, 1,
+ 500, 0, 0, 0, 1 );
+
+ return 1;
+}
+