Merge "Split time functions into rs_time.rsh header." into honeycomb
This commit is contained in:
committed by
Android (Google) Code Review
commit
d94988bb0c
@@ -66,6 +66,7 @@ public class RSTestCore {
|
|||||||
|
|
||||||
unitTests.add(new UT_primitives(this, mRes, mCtx));
|
unitTests.add(new UT_primitives(this, mRes, mCtx));
|
||||||
unitTests.add(new UT_rsdebug(this, mRes, mCtx));
|
unitTests.add(new UT_rsdebug(this, mRes, mCtx));
|
||||||
|
unitTests.add(new UT_rstime(this, mRes, mCtx));
|
||||||
unitTests.add(new UT_rstypes(this, mRes, mCtx));
|
unitTests.add(new UT_rstypes(this, mRes, mCtx));
|
||||||
unitTests.add(new UT_fp_mad(this, mRes, mCtx));
|
unitTests.add(new UT_fp_mad(this, mRes, mCtx));
|
||||||
/*
|
/*
|
||||||
|
|||||||
40
libs/rs/java/tests/src/com/android/rs/test/UT_rstime.java
Normal file
40
libs/rs/java/tests/src/com/android/rs/test/UT_rstime.java
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 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.android.rs.test;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.renderscript.*;
|
||||||
|
|
||||||
|
public class UT_rstime extends UnitTest {
|
||||||
|
private Resources mRes;
|
||||||
|
|
||||||
|
protected UT_rstime(RSTestCore rstc, Resources res, Context ctx) {
|
||||||
|
super(rstc, "rsTime", ctx);
|
||||||
|
mRes = res;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
RenderScript pRS = RenderScript.create(mCtx);
|
||||||
|
ScriptC_rstime s = new ScriptC_rstime(pRS, mRes, R.raw.rstime);
|
||||||
|
pRS.setMessageHandler(mRsMessage);
|
||||||
|
s.invoke_test_rstime(0, 0);
|
||||||
|
pRS.finish();
|
||||||
|
waitForMessage();
|
||||||
|
pRS.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
52
libs/rs/java/tests/src/com/android/rs/test/rstime.rs
Normal file
52
libs/rs/java/tests/src/com/android/rs/test/rstime.rs
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
#include "shared.rsh"
|
||||||
|
|
||||||
|
static bool basic_test(uint32_t index) {
|
||||||
|
bool failed = false;
|
||||||
|
|
||||||
|
rs_time_t curTime = rsTime(0);
|
||||||
|
rs_tm tm;
|
||||||
|
rsDebug("curTime", curTime);
|
||||||
|
|
||||||
|
rsLocaltime(&tm, &curTime);
|
||||||
|
|
||||||
|
rsDebug("tm.tm_sec", tm.tm_sec);
|
||||||
|
rsDebug("tm.tm_min", tm.tm_min);
|
||||||
|
rsDebug("tm.tm_hour", tm.tm_hour);
|
||||||
|
rsDebug("tm.tm_mday", tm.tm_mday);
|
||||||
|
rsDebug("tm.tm_mon", tm.tm_mon);
|
||||||
|
rsDebug("tm.tm_year", tm.tm_year);
|
||||||
|
rsDebug("tm.tm_wday", tm.tm_wday);
|
||||||
|
rsDebug("tm.tm_yday", tm.tm_yday);
|
||||||
|
rsDebug("tm.tm_isdst", tm.tm_isdst);
|
||||||
|
|
||||||
|
// Test a specific time (only valid for PST localtime)
|
||||||
|
curTime = 1294438893;
|
||||||
|
rsLocaltime(&tm, &curTime);
|
||||||
|
|
||||||
|
_RS_ASSERT(tm.tm_sec == 33);
|
||||||
|
_RS_ASSERT(tm.tm_min == 21);
|
||||||
|
_RS_ASSERT(tm.tm_hour == 14);
|
||||||
|
_RS_ASSERT(tm.tm_mday == 7);
|
||||||
|
_RS_ASSERT(tm.tm_mon == 0);
|
||||||
|
_RS_ASSERT(tm.tm_year == 111);
|
||||||
|
_RS_ASSERT(tm.tm_wday == 5);
|
||||||
|
_RS_ASSERT(tm.tm_yday == 6);
|
||||||
|
_RS_ASSERT(tm.tm_isdst == 0);
|
||||||
|
|
||||||
|
return failed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void test_rstime(uint32_t index, int test_num) {
|
||||||
|
bool failed = false;
|
||||||
|
failed |= basic_test(index);
|
||||||
|
|
||||||
|
if (failed) {
|
||||||
|
rsSendToClientBlocking(RS_MSG_TEST_FAILED);
|
||||||
|
rsDebug("rstime_test FAILED", -1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rsSendToClientBlocking(RS_MSG_TEST_PASSED);
|
||||||
|
rsDebug("rstime_test PASSED", 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -44,6 +44,7 @@ pthread_key_t Context::gThreadTLSKey = 0;
|
|||||||
uint32_t Context::gThreadTLSKeyCount = 0;
|
uint32_t Context::gThreadTLSKeyCount = 0;
|
||||||
uint32_t Context::gGLContextCount = 0;
|
uint32_t Context::gGLContextCount = 0;
|
||||||
pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t Context::gInitMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
pthread_mutex_t Context::gLibMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
|
||||||
static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
|
static void checkEglError(const char* op, EGLBoolean returnVal = EGL_TRUE) {
|
||||||
if (returnVal != EGL_TRUE) {
|
if (returnVal != EGL_TRUE) {
|
||||||
|
|||||||
@@ -75,6 +75,8 @@ public:
|
|||||||
static uint32_t gThreadTLSKeyCount;
|
static uint32_t gThreadTLSKeyCount;
|
||||||
static uint32_t gGLContextCount;
|
static uint32_t gGLContextCount;
|
||||||
static pthread_mutex_t gInitMutex;
|
static pthread_mutex_t gInitMutex;
|
||||||
|
// Library mutex (for providing thread-safe calls from the runtime)
|
||||||
|
static pthread_mutex_t gLibMutex;
|
||||||
|
|
||||||
struct ScriptTLSStruct {
|
struct ScriptTLSStruct {
|
||||||
Context * mContext;
|
Context * mContext;
|
||||||
|
|||||||
@@ -100,70 +100,24 @@ static float SC_frac(float v) {
|
|||||||
// Time routines
|
// Time routines
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static int32_t SC_second() {
|
static time_t SC_time(time_t *timer) {
|
||||||
GET_TLS();
|
GET_TLS();
|
||||||
|
return time(timer);
|
||||||
time_t rawtime;
|
|
||||||
time(&rawtime);
|
|
||||||
|
|
||||||
struct tm *timeinfo;
|
|
||||||
timeinfo = localtime(&rawtime);
|
|
||||||
return timeinfo->tm_sec;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t SC_minute() {
|
static tm* SC_localtime(tm *local, time_t *timer) {
|
||||||
GET_TLS();
|
GET_TLS();
|
||||||
|
if (!local) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
time_t rawtime;
|
// The native localtime function is not thread-safe, so we
|
||||||
time(&rawtime);
|
// have to apply locking for proper behavior in RenderScript.
|
||||||
|
pthread_mutex_lock(&rsc->gLibMutex);
|
||||||
struct tm *timeinfo;
|
tm *tmp = localtime(timer);
|
||||||
timeinfo = localtime(&rawtime);
|
memcpy(local, tmp, sizeof(*tmp));
|
||||||
return timeinfo->tm_min;
|
pthread_mutex_unlock(&rsc->gLibMutex);
|
||||||
}
|
return local;
|
||||||
|
|
||||||
static int32_t SC_hour() {
|
|
||||||
GET_TLS();
|
|
||||||
|
|
||||||
time_t rawtime;
|
|
||||||
time(&rawtime);
|
|
||||||
|
|
||||||
struct tm *timeinfo;
|
|
||||||
timeinfo = localtime(&rawtime);
|
|
||||||
return timeinfo->tm_hour;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t SC_day() {
|
|
||||||
GET_TLS();
|
|
||||||
|
|
||||||
time_t rawtime;
|
|
||||||
time(&rawtime);
|
|
||||||
|
|
||||||
struct tm *timeinfo;
|
|
||||||
timeinfo = localtime(&rawtime);
|
|
||||||
return timeinfo->tm_mday;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t SC_month() {
|
|
||||||
GET_TLS();
|
|
||||||
|
|
||||||
time_t rawtime;
|
|
||||||
time(&rawtime);
|
|
||||||
|
|
||||||
struct tm *timeinfo;
|
|
||||||
timeinfo = localtime(&rawtime);
|
|
||||||
return timeinfo->tm_mon;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t SC_year() {
|
|
||||||
GET_TLS();
|
|
||||||
|
|
||||||
time_t rawtime;
|
|
||||||
time(&rawtime);
|
|
||||||
|
|
||||||
struct tm *timeinfo;
|
|
||||||
timeinfo = localtime(&rawtime);
|
|
||||||
return timeinfo->tm_year;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t SC_uptimeMillis() {
|
static int64_t SC_uptimeMillis() {
|
||||||
@@ -498,12 +452,8 @@ static ScriptCState::SymbolTable_t gSyms[] = {
|
|||||||
{ "_Z6rsFracf", (void *)&SC_frac, true },
|
{ "_Z6rsFracf", (void *)&SC_frac, true },
|
||||||
|
|
||||||
// time
|
// time
|
||||||
{ "_Z8rsSecondv", (void *)&SC_second, true },
|
{ "_Z6rsTimePi", (void *)&SC_time, true },
|
||||||
{ "_Z8rsMinutev", (void *)&SC_minute, true },
|
{ "_Z11rsLocaltimeP5rs_tmPKi", (void *)&SC_localtime, true },
|
||||||
{ "_Z6rsHourv", (void *)&SC_hour, true },
|
|
||||||
{ "_Z5rsDayv", (void *)&SC_day, true },
|
|
||||||
{ "_Z7rsMonthv", (void *)&SC_month, true },
|
|
||||||
{ "_Z6rsYearv", (void *)&SC_year, true },
|
|
||||||
{ "_Z14rsUptimeMillisv", (void*)&SC_uptimeMillis, true },
|
{ "_Z14rsUptimeMillisv", (void*)&SC_uptimeMillis, true },
|
||||||
{ "_Z13rsUptimeNanosv", (void*)&SC_uptimeNanos, true },
|
{ "_Z13rsUptimeNanosv", (void*)&SC_uptimeNanos, true },
|
||||||
{ "_Z7rsGetDtv", (void*)&SC_getDt, false },
|
{ "_Z7rsGetDtv", (void*)&SC_getDt, false },
|
||||||
|
|||||||
@@ -118,32 +118,6 @@ extern float __attribute__((overloadable))
|
|||||||
extern float __attribute__((overloadable))
|
extern float __attribute__((overloadable))
|
||||||
rsFrac(float);
|
rsFrac(float);
|
||||||
|
|
||||||
// time
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsSecond(void);
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsMinute(void);
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsHour(void);
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsDay(void);
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsMonth(void);
|
|
||||||
extern int32_t __attribute__((overloadable))
|
|
||||||
rsYear(void);
|
|
||||||
|
|
||||||
// Return the current system clock in milliseconds
|
|
||||||
extern int64_t __attribute__((overloadable))
|
|
||||||
rsUptimeMillis(void);
|
|
||||||
|
|
||||||
// Return the current system clock in nanoseconds
|
|
||||||
extern int64_t __attribute__((overloadable))
|
|
||||||
rsUptimeNanos(void);
|
|
||||||
|
|
||||||
// Return the time in seconds since function was last called in this script.
|
|
||||||
extern float __attribute__((overloadable))
|
|
||||||
rsGetDt(void);
|
|
||||||
|
|
||||||
// Send a message back to the client. Will not block and returns true
|
// Send a message back to the client. Will not block and returns true
|
||||||
// if the message was sendable and false if the fifo was full.
|
// if the message was sendable and false if the fifo was full.
|
||||||
// A message ID is required. Data payload is optional.
|
// A message ID is required. Data payload is optional.
|
||||||
|
|||||||
36
libs/rs/scriptc/rs_time.rsh
Normal file
36
libs/rs/scriptc/rs_time.rsh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef __RS_TIME_RSH__
|
||||||
|
#define __RS_TIME_RSH__
|
||||||
|
|
||||||
|
typedef int rs_time_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int tm_sec;
|
||||||
|
int tm_min;
|
||||||
|
int tm_hour;
|
||||||
|
int tm_mday;
|
||||||
|
int tm_mon;
|
||||||
|
int tm_year;
|
||||||
|
int tm_wday;
|
||||||
|
int tm_yday;
|
||||||
|
int tm_isdst;
|
||||||
|
} rs_tm;
|
||||||
|
|
||||||
|
extern rs_time_t __attribute__((overloadable))
|
||||||
|
rsTime(rs_time_t *timer);
|
||||||
|
|
||||||
|
extern rs_tm * __attribute__((overloadable))
|
||||||
|
rsLocaltime(rs_tm *local, const rs_time_t *timer);
|
||||||
|
|
||||||
|
// Return the current system clock in milliseconds
|
||||||
|
extern int64_t __attribute__((overloadable))
|
||||||
|
rsUptimeMillis(void);
|
||||||
|
|
||||||
|
// Return the current system clock in nanoseconds
|
||||||
|
extern int64_t __attribute__((overloadable))
|
||||||
|
rsUptimeNanos(void);
|
||||||
|
|
||||||
|
// Return the time in seconds since function was last called in this script.
|
||||||
|
extern float __attribute__((overloadable))
|
||||||
|
rsGetDt(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user