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