rsdSampler.cpp revision 06b0f7d3b345ae1c36aed6686e79e403650f8baa
17f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk/* 27f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 37f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * 47f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 57f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * you may not use this file except in compliance with the License. 67f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * You may obtain a copy of the License at 77f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * 87f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 97f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * 107f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 117f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 127f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * See the License for the specific language governing permissions and 147f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk * limitations under the License. 157f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk */ 167f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 177f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 187f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsdCore.h" 197f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsdSampler.h" 207f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 217f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsContext.h" 227f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsSampler.h" 2393eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams 2493eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#ifndef RS_COMPATIBILITY_LIB 257f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsProgramVertex.h" 267f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include "rsProgramFragment.h" 277f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 287f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include <GLES/gl.h> 297f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk#include <GLES/glext.h> 3093eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#endif 317f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 3206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samstypedef float float2 __attribute__((ext_vector_type(2))); 3306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samstypedef float float3 __attribute__((ext_vector_type(3))); 3406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samstypedef float float4 __attribute__((ext_vector_type(4))); 3506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samstypedef uint8_t uchar4 __attribute__((ext_vector_type(4))); 3606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 377f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukusing namespace android; 387f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukusing namespace android::renderscript; 397f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 4006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#if defined(ARCH_ARM_HAVE_VFP) 4106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams #define LOCAL_CALL __attribute__((pcs("aapcs-vfp"))) 4206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#else 4306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams #define LOCAL_CALL 4406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#endif 4506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 4606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// 565 Conversion bits taken from SkBitmap 4706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_R16_BITS 5 4806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_G16_BITS 6 4906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_B16_BITS 5 5006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 5106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_R16_SHIFT (SK_B16_BITS + SK_G16_BITS) 5206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_G16_SHIFT (SK_B16_BITS) 5306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_B16_SHIFT 0 5406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 5506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_R16_MASK ((1 << SK_R16_BITS) - 1) 5606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_G16_MASK ((1 << SK_G16_BITS) - 1) 5706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SK_B16_MASK ((1 << SK_B16_BITS) - 1) 5806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 5906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline unsigned SkR16ToR32(unsigned r) { 6006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return (r << (8 - SK_R16_BITS)) | (r >> (2 * SK_R16_BITS - 8)); 6106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 6206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 6306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline unsigned SkG16ToG32(unsigned g) { 6406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return (g << (8 - SK_G16_BITS)) | (g >> (2 * SK_G16_BITS - 8)); 6506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 6606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 6706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline unsigned SkB16ToB32(unsigned b) { 6806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return (b << (8 - SK_B16_BITS)) | (b >> (2 * SK_B16_BITS - 8)); 6906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 7006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 7106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkPacked16ToR32(c) SkR16ToR32(SkGetPackedR16(c)) 7206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkPacked16ToG32(c) SkG16ToG32(SkGetPackedG16(c)) 7306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkPacked16ToB32(c) SkB16ToB32(SkGetPackedB16(c)) 7406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 7506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkGetPackedR16(color) (((unsigned)(color) >> SK_R16_SHIFT) & SK_R16_MASK) 7606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkGetPackedG16(color) (((unsigned)(color) >> SK_G16_SHIFT) & SK_G16_MASK) 7706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#define SkGetPackedB16(color) (((unsigned)(color) >> SK_B16_SHIFT) & SK_B16_MASK) 7806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 7906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float3 getFrom565(uint16_t color) { 8006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 result; 8106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.x = (float)SkPacked16ToR32(color); 8206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.y = (float)SkPacked16ToG32(color); 8306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.z = (float)SkPacked16ToB32(color); 8406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return result; 8506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 8606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 8706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 8806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 8906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams/** 9006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams* Allocation sampling 9106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams*/ 9206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float getElementAt1(const uint8_t *p, int32_t x) { 9306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p[x]; 9406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 9506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 9606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 9706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float2 getElementAt2(const uint8_t *p, int32_t x) { 9806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 2; 9906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 r = {p[x], p[x+1]}; 10006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 10106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 10206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 10306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float3 getElementAt3(const uint8_t *p, int32_t x) { 10406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 4; 10506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = {p[x], p[x+1], p[x+2]}; 10606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 10706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 10806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 10906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float4 getElementAt4(const uint8_t *p, int32_t x) { 11006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 4; 11106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 r = {p[x], p[x+1], p[x+2], p[x+3]}; 11206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 11306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 11406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 11506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float3 getElementAt565(const uint8_t *p, int32_t x) { 11606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 2; 11706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = getFrom565(((const uint16_t *)p)[0]); 11806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 11906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 12006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 12106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float getElementAt1(const uint8_t *p, size_t stride, int32_t x, int32_t y) { 12206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams p += y * stride; 12306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p[x]; 12406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 12506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 12606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 12706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float2 getElementAt2(const uint8_t *p, size_t stride, int32_t x, int32_t y) { 12806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams p += y * stride; 12906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 2; 13006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 r = {p[x], p[x+1]}; 13106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 13206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 13306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 13406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float3 getElementAt3(const uint8_t *p, size_t stride, int32_t x, int32_t y) { 13506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams p += y * stride; 13606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 4; 13706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = {p[x], p[x+1], p[x+2]}; 13806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 13906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 14006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 14106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float4 getElementAt4(const uint8_t *p, size_t stride, int32_t x, int32_t y) { 14206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams p += y * stride; 14306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 4; 14406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 r = {p[x], p[x+1], p[x+2], p[x+3]}; 14506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 14606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 14706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 14806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic inline float3 getElementAt565(const uint8_t *p, size_t stride, int32_t x, int32_t y) { 14906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams p += y * stride; 15006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams x *= 2; 15106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = getFrom565(((const uint16_t *)p)[0]); 15206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 15306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 15406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 15506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 15606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 15706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 15806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 15906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 16006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_A(const uint8_t *p, int32_t iPixel, 16106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 16206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p0 = getElementAt1(p, iPixel); 16306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p1 = getElementAt1(p, next); 16406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p0 * w0 + p1 * w1; 16506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 16606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {0.f, 0.f, 0.f, r}; 16706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 16806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 16906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 17006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_L(const uint8_t *p, int32_t iPixel, 17106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 17206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p0 = getElementAt1(p, iPixel); 17306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p1 = getElementAt1(p, next); 17406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p0 * w0 + p1 * w1; 17506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 17606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r, r, r, 1.f}; 17706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 17806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 17906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 18006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_LA(const uint8_t *p, int32_t iPixel, 18106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 18206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p0 = getElementAt2(p, iPixel); 18306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p1 = getElementAt2(p, next); 18406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 r = p0 * w0 + p1 * w1; 18506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 18606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.x, r.x, r.y}; 18706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 18806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 18906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 19006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_RGB(const uint8_t *p, int32_t iPixel, 19106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 19206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p0 = getElementAt3(p, iPixel); 19306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p1 = getElementAt3(p, next); 19406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = p0 * w0 + p1 * w1; 19506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 19606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.x, r.z, 1.f}; 19706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 19806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 19906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 20006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_565(const uint8_t *p, int32_t iPixel, 20106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 20206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p0 = getElementAt565(p, iPixel); 20306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p1 = getElementAt565(p, next); 20406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = p0 * w0 + p1 * w1; 20506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 20606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.x, r.z, 1.f}; 20706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 20806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 20906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 21006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample1D_RGBA(const uint8_t *p, int32_t iPixel, 21106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next, float w0, float w1) { 21206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p0 = getElementAt4(p, iPixel); 21306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p1 = getElementAt4(p, next); 21406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 r = p0 * w0 + p1 * w1; 21506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 21606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 21706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 21806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 21906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 22006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 22106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample2D_A(const uint8_t *p, size_t stride, 22206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 22306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 22406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p0 = getElementAt1(p, stride, locX, locY); 22506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p1 = getElementAt1(p, stride, nextX, locY); 22606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p2 = getElementAt1(p, stride, locX, nextY); 22706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p3 = getElementAt1(p, stride, nextX, nextY); 22806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 22906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 23006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {0.f, 0.f, 0.f, r}; 23106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 23206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 23306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 23406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample2D_L(const uint8_t *p, size_t stride, 23506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 23606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 23706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p0 = getElementAt1(p, stride, locX, locY); 23806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p1 = getElementAt1(p, stride, nextX, locY); 23906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p2 = getElementAt1(p, stride, locX, nextY); 24006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float p3 = getElementAt1(p, stride, nextX, nextY); 24106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 24206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 24306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r, r, r, 1.f}; 24406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 24506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 24606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 24706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample2D_LA(const uint8_t *p, size_t stride, 24806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 24906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 25006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p0 = getElementAt2(p, stride, locX, locY); 25106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p1 = getElementAt2(p, stride, nextX, locY); 25206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p2 = getElementAt2(p, stride, locX, nextY); 25306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 p3 = getElementAt2(p, stride, nextX, nextY); 25406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 25506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 25606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.x, r.x, r.y}; 25706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 25806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 25906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 26006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample2D_RGB(const uint8_t *p, size_t stride, 26106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 26206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 26306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p0 = getElementAt4(p, stride, locX, locY); 26406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p1 = getElementAt4(p, stride, nextX, locY); 26506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p2 = getElementAt4(p, stride, locX, nextY); 26606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p3 = getElementAt4(p, stride, nextX, nextY); 26706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 26806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 26906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.y, r.z, 1.f}; 27006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 27106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 27206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 LOCAL_CALL 27306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams getSample2D_RGBA(const uint8_t *p, size_t stride, 27406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 27506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 27606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p0 = getElementAt4(p, stride, locX, locY); 27706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p1 = getElementAt4(p, stride, nextX, locY); 27806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p2 = getElementAt4(p, stride, locX, nextY); 27906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 p3 = getElementAt4(p, stride, nextX, nextY); 28006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 28106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 28206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return r; 28306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 28406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 getSample2D_565(const uint8_t *p, size_t stride, 28506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX, int locY, int nextX, int nextY, 28606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) { 28706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p0 = getElementAt565(p, stride, locX, locY); 28806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p1 = getElementAt565(p, stride, nextX, locY); 28906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p2 = getElementAt565(p, stride, locX, nextY); 29006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 p3 = getElementAt565(p, stride, nextX, nextY); 29106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float3 r = p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; 29206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams r *= (1.f / 255.f); 29306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 ret = {r.x, r.y, r.z, 1.f}; 29406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return ret; 29506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 29606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 29706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 29806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsextern "C" { 29906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams typedef float4 Sampler2DFn(const uint8_t *p, size_t stride, 30006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int lx, int ly, int nx, int ny, 30106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w0, float w1, float w2, float w3) LOCAL_CALL; 30206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 30306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler2DFn rsdCpuGetSample2D_L_k; 30406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler2DFn rsdCpuGetSample2D_A_k; 30506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler2DFn rsdCpuGetSample2D_LA_k; 30606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler2DFn rsdCpuGetSample2D_RGB_k; 30706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler2DFn rsdCpuGetSample2D_RGBA_k; 30806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 30906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 31006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#if 0 31106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic Sampler2DFn* GetBilinearSampleTable2D[] = { 31206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 0, 0, 0, 0, 0, 0, 31306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0,//rsdCpuGetSample2D_L_k, 31406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0,//rsdCpuGetSample2D_A_k, 31506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0,//rsdCpuGetSample2D_LA_k, 31606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0,//rsdCpuGetSample2D_RGB_k, 31706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsdCpuGetSample2D_RGBA_k 31806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 31906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 32006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#else 32106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic Sampler2DFn* GetBilinearSampleTable2D[] = { 32206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 0, 0, 0, 0, 0, 0, 32306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams &getSample2D_L, 32406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams &getSample2D_A, 32506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams &getSample2D_LA, 32606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams &getSample2D_RGB, 32706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams &getSample2D_RGBA, 32806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 32906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams#endif 33006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 33106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 33206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic int applyWrapMode(RsSamplerValue mode, int coord, int size) { 33306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch (mode) { 33406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_WRAP: 33506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = coord % size; 33606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (coord < 0) { 33706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord += size; 33806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 33906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 34006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 34106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_CLAMP: 34206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = rsMax(0, rsMin(coord, size - 1)); 34306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 34406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 34506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_MIRRORED_REPEAT: 34606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = coord % (size * 2); 34706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (coord < 0) { 34806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = (size * 2) + coord; 34906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 35006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (coord >= size) { 35106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = (size * 2) - coord; 35206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 35306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 35406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 35506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams default: 35606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams coord = 0; 35706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsAssert(0); 35806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 35906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return coord; 36006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 36106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 36206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 36306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams sample_LOD_LinearPixel(Allocation *a, const Type *type, 36406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsDataKind dk, RsDataType dt, 36506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler *s, 36606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float uv, int32_t lod) { 36706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsSamplerValue wrapS = s->mHal.state.wrapS; 36806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t sourceW = type->mHal.state.lodDimX[lod]; 36906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float pixelUV = uv * (float)(sourceW); 37006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t iPixel = (int32_t)(pixelUV); 37106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float frac = pixelUV - (float)iPixel; 37206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 37306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (frac < 0.5f) { 37406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams iPixel -= 1; 37506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams frac += 0.5f; 37606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } else { 37706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams frac -= 0.5f; 37806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 37906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 38006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float oneMinusFrac = 1.0f - frac; 38106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 38206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t next = applyWrapMode(wrapS, iPixel + 1, sourceW); 38306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t loc = applyWrapMode(wrapS, iPixel, sourceW); 38406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 38506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const uint8_t *ptr = (const uint8_t *)a->mHal.drvState.lod[lod].mallocPtr; 38606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 38706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5) { 38806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_565(ptr, loc, next, next, frac); 38906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 39006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 39106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(dk) { 39206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_L: 39306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_L(ptr, loc, next, next, frac); 39406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_A: 39506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_A(ptr, loc, next, next, frac); 39606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_LA: 39706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_LA(ptr, loc, next, next, frac); 39806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGB: 39906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_RGB(ptr, loc, next, next, frac); 40006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGBA: 40106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample1D_RGBA(ptr, loc, next, next, frac); 40206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 40306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_YUV: 40406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_USER: 40506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_INVALID: 40606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_DEPTH: 40706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsAssert(0); 40806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 40906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 41006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 41106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return 0.f; 41206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 41306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 41406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 41506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams sample_LOD_NearestPixel(Allocation *a, const Type *type, 41606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsDataKind dk, RsDataType dt, 41706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler *s, float uv, int32_t lod) { 41806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsSamplerValue wrapS = s->mHal.state.wrapS; 41906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t sourceW = type->mHal.state.lodDimX[lod]; 42006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t iPixel = (int32_t)(uv * (float)(sourceW)); 42106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t location = applyWrapMode(wrapS, iPixel, sourceW); 42206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 42306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 42406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const uint8_t *ptr = (const uint8_t *)a->mHal.drvState.lod[lod].mallocPtr; 42506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 42606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 result = {0.f, 0.f, 0.f, 1.f}; 42706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5) { 42806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = getElementAt565(ptr, iPixel); 42906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return result; 43006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 43106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 43206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(dk) { 43306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_L: 43406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams { 43506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float t = getElementAt1(ptr, iPixel); 43606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = t; 43706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 43806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 43906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_A: 44006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.w = getElementAt1(ptr, iPixel); 44106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 44206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_LA: 44306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams { 44406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 t = getElementAt2(ptr, iPixel); 44506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = t.x; 44606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.w = t.y; 44706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 44806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 44906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGB: 45006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = getElementAt3(ptr, iPixel); 45106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 45206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGBA: 45306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result = getElementAt4(ptr, iPixel); 45406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 45506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 45606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_YUV: 45706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_USER: 45806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_INVALID: 45906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_DEPTH: 46006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsAssert(0); 46106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 46206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 46306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 46406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return result * (1.f / 255.f); 46506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 46606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 46706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 46806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 46906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams sample_LOD_LinearPixel(Allocation *a, const Type *type, 47006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsDataKind dk, RsDataType dt, 47106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler *s, float u, float v, int32_t lod) { 47206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsSamplerValue wrapS = s->mHal.state.wrapS; 47306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsSamplerValue wrapT = s->mHal.state.wrapT; 47406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const int sourceW = type->mHal.state.lodDimX[lod]; 47506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const int sourceH = type->mHal.state.lodDimY[lod]; 47606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 47706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float pixelU = u * (float)sourceW; 47806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float pixelV = v * (float)sourceH; 47906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int iPixelU = (int)pixelU; 48006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int iPixelV = (int)pixelV; 48106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 48206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float fracU = pixelU - iPixelU; 48306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float fracV = pixelV - iPixelV; 48406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 48506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (fracU < 0.5f) { 48606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams iPixelU -= 1; 48706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams fracU += 0.5f; 48806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } else { 48906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams fracU -= 0.5f; 49006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 49106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (fracV < 0.5f) { 49206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams iPixelV -= 1; 49306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams fracV += 0.5f; 49406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } else { 49506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams fracV -= 0.5f; 49606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 49706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float oneMinusFracU = 1.0f - fracU; 49806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float oneMinusFracV = 1.0f - fracV; 49906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 50006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w1 = oneMinusFracU * oneMinusFracV; 50106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w2 = fracU * oneMinusFracV; 50206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w3 = oneMinusFracU * fracV; 50306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float w4 = fracU * fracV; 50406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 50506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int nextX = applyWrapMode(wrapS, iPixelU + 1, sourceW); 50606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int nextY = applyWrapMode(wrapT, iPixelV + 1, sourceH); 50706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX = applyWrapMode(wrapS, iPixelU, sourceW); 50806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locY = applyWrapMode(wrapT, iPixelV, sourceH); 50906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 51006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const uint8_t *ptr = (const uint8_t *)a->mHal.drvState.lod[lod].mallocPtr; 51106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams size_t stride = a->mHal.drvState.lod[lod].stride; 51206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 51306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5) { 51406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return getSample2D_565(ptr, stride, locX, locY, nextX, nextY, w1, w2, w3, w4); 51506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 51606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 51706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return GetBilinearSampleTable2D[dk](ptr, stride, locX, locY, nextX, nextY, w1, w2, w3, w4); 51806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 51906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 52006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 52106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams sample_LOD_NearestPixel(Allocation *a, const Type *type, 52206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsDataKind dk, RsDataType dt, 52306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams Sampler *s, 52406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float u, float v, int32_t lod) { 52506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsSamplerValue wrapS = s->mHal.state.wrapS; 52606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams RsSamplerValue wrapT = s->mHal.state.wrapT; 52706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 52806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t sourceW = type->mHal.state.lodDimX[lod]; 52906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t sourceH = type->mHal.state.lodDimY[lod]; 53006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 53106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locX = applyWrapMode(wrapS, u * sourceW, sourceW); 53206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int locY = applyWrapMode(wrapT, v * sourceH, sourceH); 53306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 53406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 53506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const uint8_t *ptr = (const uint8_t *)a->mHal.drvState.lod[lod].mallocPtr; 53606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams size_t stride = a->mHal.drvState.lod[lod].stride; 53706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 53806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 result = {0.f, 0.f, 0.f, 1.f}; 53906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dt == RS_TYPE_UNSIGNED_5_6_5) { 54006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = getElementAt565(ptr, stride, locX, locY); 54106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return result; 54206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 54306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 54406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(dk) { 54506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_L: 54606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams { 54706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float t = getElementAt1(ptr, stride, locX, locY); 54806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = t; 54906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 55006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 55106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_A: 55206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.w = getElementAt1(ptr, stride, locX, locY); 55306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 55406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_LA: 55506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams { 55606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float2 t = getElementAt2(ptr, stride, locX, locY); 55706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = t.x; 55806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.w = t.y; 55906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 56006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 56106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGB: 56206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result.xyz = getElementAt3(ptr, stride, locX, locY); 56306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 56406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_RGBA: 56506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams result = getElementAt4(ptr, stride, locX, locY); 56606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 56706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 56806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 56906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_YUV: 57006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_USER: 57106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_INVALID: 57206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_KIND_PIXEL_DEPTH: 57306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsAssert(0); 57406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 57506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 57606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 57706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return result * (1.f / 255.f); 57806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 57906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 58006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 58106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 58206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 GenericSample1D(Allocation *a, Sampler *s, float u, float lod) { 58306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Type *type = a->getType(); 58406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Element *elem = type->getElement(); 58506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsDataKind dk = elem->getKind(); 58606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsDataType dt = elem->getType(); 58706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 58806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dk == RS_KIND_USER || (dt != RS_TYPE_UNSIGNED_8 && dt != RS_TYPE_UNSIGNED_5_6_5)) { 58906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return 0.f; 59006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 59106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 59206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (!(a->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE)) { 59306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Context *rsc = RsdCpuReference::getTlsContext(); 59406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Sampling from texture witout USAGE_GRAPHICS_TEXTURE."); 59506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return 0.f; 59606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 59706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 59806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (lod <= 0.0f) { 59906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.magFilter == RS_SAMPLER_NEAREST) { 60006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_NearestPixel(a, type, dk, dt, s, u, 0); 60106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 60206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_LinearPixel(a, type, dk, dt, s, u, 0); 60306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 60406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 60506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.minFilter == RS_SAMPLER_LINEAR_MIP_NEAREST) { 60606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t maxLOD = type->mHal.state.lodCount - 1; 60706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod = rsMin(lod, (float)maxLOD); 60806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t nearestLOD = (int32_t)round(lod); 60906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_LinearPixel(a, type, dk, dt, s, u, nearestLOD); 61006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 61106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 61206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.minFilter == RS_SAMPLER_LINEAR_MIP_LINEAR) { 61306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t lod0 = (int32_t)floor(lod); 61406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t lod1 = (int32_t)ceil(lod); 61506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t maxLOD = type->mHal.state.lodCount - 1; 61606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod0 = rsMin(lod0, maxLOD); 61706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod1 = rsMin(lod1, maxLOD); 61806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 sample0 = sample_LOD_LinearPixel(a, type, dk, dt, s, u, lod0); 61906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 sample1 = sample_LOD_LinearPixel(a, type, dk, dt, s, u, lod1); 62006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float frac = lod - (float)lod0; 62106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample0 * (1.0f - frac) + sample1 * frac; 62206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 62306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 62406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_NearestPixel(a, type, dk, dt, s, u, 0); 62506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 62606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 62706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic float4 GenericSample2D(Allocation *a, Sampler *s, float u, float v, float lod) { 62806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Type *type = a->getType(); 62906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Element *elem = type->getElement(); 63006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsDataKind dk = elem->getKind(); 63106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const RsDataType dt = elem->getType(); 63206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 63306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (dk == RS_KIND_USER || (dt != RS_TYPE_UNSIGNED_8 && dt != RS_TYPE_UNSIGNED_5_6_5)) { 63406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return 0.f; 63506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 63606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 63706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (!(a->mHal.state.usageFlags & RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE)) { 63806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams const Context *rsc = RsdCpuReference::getTlsContext(); 63906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Sampling from texture witout USAGE_GRAPHICS_TEXTURE."); 64006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return 0.f; 64106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 64206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 64306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (lod <= 0.0f) { 64406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.magFilter == RS_SAMPLER_NEAREST) { 64506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_NearestPixel(a, type, dk, dt, s, u, v, 0); 64606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 64706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_LinearPixel(a, type, dk, dt, s, u, v, 0); 64806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 64906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 65006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.minFilter == RS_SAMPLER_LINEAR_MIP_NEAREST) { 65106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t maxLOD = type->mHal.state.lodCount - 1; 65206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod = rsMin(lod, (float)maxLOD); 65306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t nearestLOD = (int32_t)round(lod); 65406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_LinearPixel(a, type, dk, dt, s, u, v, nearestLOD); 65506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 65606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 65706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if (s->mHal.state.minFilter == RS_SAMPLER_LINEAR_MIP_LINEAR) { 65806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t lod0 = (int32_t)floor(lod); 65906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t lod1 = (int32_t)ceil(lod); 66006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams int32_t maxLOD = type->mHal.state.lodCount - 1; 66106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod0 = rsMin(lod0, maxLOD); 66206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams lod1 = rsMin(lod1, maxLOD); 66306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 sample0 = sample_LOD_LinearPixel(a, type, dk, dt, s, u, v, lod0); 66406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float4 sample1 = sample_LOD_LinearPixel(a, type, dk, dt, s, u, v, lod1); 66506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams float frac = lod - (float)lod0; 66606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample0 * (1.0f - frac) + sample1 * frac; 66706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 66806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 66906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams return sample_LOD_NearestPixel(a, type, dk, dt, s, u, v, 0); 67006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams} 67106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 67206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 67306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 67406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 67506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// Must match pixel kind in rsDefines.h 67606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * NearestWrap[] = { 67706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 67806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 67906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 68006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 68106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 68206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 68306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 68406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 68506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 68606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 68706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 68806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 68906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 69006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 69106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 69206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 69306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 69406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * NearestClamp[] = { 69506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 69606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 69706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 69806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 69906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 70006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 70106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 70206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 70306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 70406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 70506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 70606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 70706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 70806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 70906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 71006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 71106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 71206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * NearestMirroredRepeat[] = { 71306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 71406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 71506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 71606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 71706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 71806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 71906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 72006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 72106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 72206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 72306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 72406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 72506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 72606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 72706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 72806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 72906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 73006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// Must match pixel kind in rsDefines.h 73106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * LinearWrap[] = { 73206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 73306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 73406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 73506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 73606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 73706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 73806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 73906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 74006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 74106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 74206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 74306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 74406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 74506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 74606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 74706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 74806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 74906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// Must match pixel kind in rsDefines.h 75006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * LinearClamp[] = { 75106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 75206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 75306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 75406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 75506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 75606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 75706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 75806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 75906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 76006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 76106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 76206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 76306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 76406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 76506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 76606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 76706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 76806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// Must match pixel kind in rsDefines.h 76906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * LinearMirroredRepeat[] = { 77006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 77106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 77206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 77306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 77406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 77506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 77606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 77706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 77806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 77906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 78006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 78106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 78206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 78306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 78406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 78506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 78606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 78706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams// Must match pixel kind in rsDefines.h 78806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsstatic void * Generic[] = { 78906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // L, 79006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // A, 79106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // LA, 79206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGB, 79306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // RGBA, 79406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 79506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample1D, // YUV 79606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 79706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // L, 79806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // A, 79906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // LA, 80006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGB, 80106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // RGBA, 80206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 0, 80306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (void *) GenericSample2D, // YUV 80406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams}; 80506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 80606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Samsbool rsdSamplerInit(const Context *, const Sampler *s) { 80706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = Generic; 80806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 80906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams if ((s->mHal.state.minFilter == s->mHal.state.magFilter) && 81006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams (s->mHal.state.wrapS == s->mHal.state.wrapT)) { 81106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams // We have fast paths for these. 81206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 81306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(s->mHal.state.minFilter) { 81406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_NEAREST: 81506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(s->mHal.state.wrapS) { 81606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_WRAP: 81706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = NearestWrap; 81806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 81906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_CLAMP: 82006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = NearestClamp; 82106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 82206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_MIRRORED_REPEAT: 82306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = NearestMirroredRepeat; 82406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 82506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams default: 82606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 82706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 82806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 82906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_LINEAR: 83006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(s->mHal.state.wrapS) { 83106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_WRAP: 83206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearWrap; 83306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 83406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_CLAMP: 83506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearClamp; 83606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 83706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_MIRRORED_REPEAT: 83806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearMirroredRepeat; 83906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 84006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams default: 84106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 84206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 84306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 84406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_LINEAR_MIP_LINEAR: 84506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams switch(s->mHal.state.wrapS) { 84606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_WRAP: 84706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearWrap; 84806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 84906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_CLAMP: 85006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearClamp; 85106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 85206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams case RS_SAMPLER_MIRRORED_REPEAT: 85306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams s->mHal.drv = LinearMirroredRepeat; 85406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 85506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams default: 85606b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 85706b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 85806b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 85906b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams default: 86006b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams rsAssert(0); 86106b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams break; 86206b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 86306b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 86406b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams } 86506b0f7d3b345ae1c36aed6686e79e403650f8baaJason Sams 8667f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk return true; 8677f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk} 8687f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk 8697f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchoukvoid rsdSamplerDestroy(const android::renderscript::Context *rsc, 8707f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk const android::renderscript::Sampler *s) { 8717f126c78a107257090c6675ea40ffac41516a9dcAlex Sakhartchouk} 872