fptest.cpp revision 3cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23
13cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams/* 23cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * Copyright (C) 2007 The Android Open Source Project 33cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * 43cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 53cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * you may not use this file except in compliance with the License. 63cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * You may obtain a copy of the License at 73cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * 83cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 93cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * 103cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * Unless required by applicable law or agreed to in writing, software 113cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 123cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * See the License for the specific language governing permissions and 143cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams * limitations under the License. 153cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams */ 163cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 173cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <stdio.h> 183cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <stdlib.h> 193cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <string.h> 203cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sys/time.h> 213cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <time.h> 223cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <unistd.h> 233cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sched.h> 243cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sys/resource.h> 253cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sys/syscall.h> 263cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sys/types.h> 273cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#include <sys/mman.h> 283cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 293cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samstypedef struct { 303cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams unsigned char x; 313cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams unsigned char y; 323cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams unsigned char z; 333cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams unsigned char w; 343cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} uchar4; 353cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 363cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samstypedef struct { 373cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float x; 383cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float y; 393cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float z; 403cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float w; 413cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} float4; 423cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 433cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 443cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#define MAX_RADIUS 25 453cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#define WIDTH 512 463cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams#define HEIGHT 512 473cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 483cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsuchar4 bufIn[WIDTH * HEIGHT]; 493cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsuchar4 bufOut[WIDTH * HEIGHT]; 503cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsuchar4 bufTmp[WIDTH * HEIGHT]; 513cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 523cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic float gaussian[MAX_RADIUS * 2 + 1]; 533cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic int height = 512; 543cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic int width = 512; 553cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic int radius = MAX_RADIUS; 563cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 573cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 583cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 593cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic void horiz(uchar4 *output, const uchar4 *inputBuf, uint32_t x, uint32_t y) { 603cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams const uchar4 *input = inputBuf + (y * width); 613cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float4 blurredPixel = {0,0,0,0}; 623cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float4 currentPixel; 633cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 643cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for(int r = -radius; r <= radius; r ++) { 653cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams // Stepping left and right away from the pixel 663cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams int validW = x + r; 673cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams // Clamp to zero and width max() isn't exposed for ints yet 683cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams if(validW < 0) { 693cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams validW = 0; 703cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 713cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams if(validW > WIDTH - 1) { 723cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams validW = WIDTH - 1; 733cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 743cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams //int validW = rsClamp(w + r, 0, width - 1); 753cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 763cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float weight = gaussian[r + radius]; 773cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.x = (float)(input[validW].x); 783cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.y = (float)(input[validW].y); 793cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.z = (float)(input[validW].z); 803cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams //currentPixel.w = (float)(input->a); 813cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 823cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.x += currentPixel.x * weight; 833cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.y += currentPixel.y * weight; 843cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.z += currentPixel.z * weight; 853cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 863cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 873cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->x = (uint8_t)blurredPixel.x; 883cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->y = (uint8_t)blurredPixel.y; 893cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->z = (uint8_t)blurredPixel.z; 903cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} 913cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 923cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 933cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic void vert(uchar4 *output, const uchar4 *inputBuf, uint32_t x, uint32_t y) { 943cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams const uchar4 *input = inputBuf + x; 953cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 963cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float4 blurredPixel = {0,0,0,0}; 973cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 983cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float4 currentPixel; 993cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for(int r = -radius; r <= radius; r ++) { 1003cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams int validH = y + r; 1013cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams // Clamp to zero and width 1023cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams if(validH < 0) { 1033cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams validH = 0; 1043cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1053cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams if(validH > HEIGHT - 1) { 1063cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams validH = HEIGHT - 1; 1073cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1083cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1093cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams const uchar4 *i = input + validH * WIDTH; 1103cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1113cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams float weight = gaussian[r + radius]; 1123cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1133cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.x = (float)(i->x); 1143cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.y = (float)(i->y); 1153cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams currentPixel.z = (float)(i->z); 1163cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1173cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.x += currentPixel.x * weight; 1183cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.y += currentPixel.y * weight; 1193cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams blurredPixel.z += currentPixel.z * weight; 1203cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1213cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1223cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams //output->xyz = convert_uchar3(blurredPixel.xyz); 1233cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->x = (uint8_t)blurredPixel.x; 1243cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->y = (uint8_t)blurredPixel.y; 1253cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams output->z = (uint8_t)blurredPixel.z; 1263cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} 1273cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1283cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1293cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samstypedef long long nsecs_t; 1303cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1313cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsstatic nsecs_t system_time() 1323cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams{ 1333cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams struct timespec t; 1343cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams t.tv_sec = t.tv_nsec = 0; 1353cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams clock_gettime(CLOCK_MONOTONIC, &t); 1363cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; 1373cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} 1383cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1393cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Samsint fp_test(int argc, char** argv) { 1403cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for (int ct=0; ct < (sizeof(gaussian)/4); ct++) { 1413cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams gaussian[ct] = 1.f; 1423cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1433cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams memset(bufIn, 0, sizeof(bufIn)); 1443cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1453cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams nsecs_t t1 = system_time(); 1463cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1473cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for (int y = 0; y < HEIGHT; y++) { 1483cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for (int x = 0; x < WIDTH; x++) { 1493cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams horiz(&bufTmp[x + y * WIDTH], bufIn, x, y); 1503cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1513cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1523cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1533cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for (int y = 0; y < HEIGHT; y++) { 1543cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams for (int x = 0; x < WIDTH; x++) { 1553cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams vert(&bufOut[x + y * WIDTH], bufTmp, x, y); 1563cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1573cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams } 1583cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1593cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams nsecs_t t2 = system_time(); 1603cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1613cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams printf("FP Test time %i ms\n", (int)((t2 - t1) / 1000000) ); 1623cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 1633cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams return 0; 1643cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams} 1653cadc3a6df0b13deabb1b3423aafa5ff8bbfdf23Jason Sams 166