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