1*8975f5c5SAndroid Build Coastguard Worker// 2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2015 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker// Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker// found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker// 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker// generatemip.inc: Defines the GenerateMip function, templated on the format 8*8975f5c5SAndroid Build Coastguard Worker// type of the image for which mip levels are being generated. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker#include "common/mathutil.h" 11*8975f5c5SAndroid Build Coastguard Worker 12*8975f5c5SAndroid Build Coastguard Worker#include "image_util/imageformats.h" 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Workernamespace angle 15*8975f5c5SAndroid Build Coastguard Worker{ 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Workernamespace priv 18*8975f5c5SAndroid Build Coastguard Worker{ 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 21*8975f5c5SAndroid Build Coastguard Workerstatic inline T *GetPixel(uint8_t *data, size_t x, size_t y, size_t z, size_t rowPitch, size_t depthPitch) 22*8975f5c5SAndroid Build Coastguard Worker{ 23*8975f5c5SAndroid Build Coastguard Worker return reinterpret_cast<T*>(data + (x * sizeof(T)) + (y * rowPitch) + (z * depthPitch)); 24*8975f5c5SAndroid Build Coastguard Worker} 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 27*8975f5c5SAndroid Build Coastguard Workerstatic inline const T *GetPixel(const uint8_t *data, size_t x, size_t y, size_t z, size_t rowPitch, size_t depthPitch) 28*8975f5c5SAndroid Build Coastguard Worker{ 29*8975f5c5SAndroid Build Coastguard Worker return reinterpret_cast<const T*>(data + (x * sizeof(T)) + (y * rowPitch) + (z * depthPitch)); 30*8975f5c5SAndroid Build Coastguard Worker} 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 33*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_Y(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 34*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 35*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 36*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 37*8975f5c5SAndroid Build Coastguard Worker{ 38*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth == 1); 39*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight > 1); 40*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth == 1); 41*8975f5c5SAndroid Build Coastguard Worker 42*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < destHeight; y++) 43*8975f5c5SAndroid Build Coastguard Worker { 44*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, 0, y * 2, 0, sourceRowPitch, sourceDepthPitch); 45*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, 0, y * 2 + 1, 0, sourceRowPitch, sourceDepthPitch); 46*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, 0, y, 0, destRowPitch, destDepthPitch); 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker T::average(dst, src0, src1); 49*8975f5c5SAndroid Build Coastguard Worker } 50*8975f5c5SAndroid Build Coastguard Worker} 51*8975f5c5SAndroid Build Coastguard Worker 52*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 53*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_X(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 54*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 55*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 56*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 57*8975f5c5SAndroid Build Coastguard Worker{ 58*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth > 1); 59*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight == 1); 60*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth == 1); 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < destWidth; x++) 63*8975f5c5SAndroid Build Coastguard Worker { 64*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, x * 2, 0, 0, sourceRowPitch, sourceDepthPitch); 65*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, x * 2 + 1, 0, 0, sourceRowPitch, sourceDepthPitch); 66*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, x, 0, 0, destRowPitch, destDepthPitch); 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker T::average(dst, src0, src1); 69*8975f5c5SAndroid Build Coastguard Worker } 70*8975f5c5SAndroid Build Coastguard Worker} 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 73*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_Z(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 74*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 75*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 76*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 77*8975f5c5SAndroid Build Coastguard Worker{ 78*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth == 1); 79*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight == 1); 80*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth > 1); 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < destDepth; z++) 83*8975f5c5SAndroid Build Coastguard Worker { 84*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, 0, 0, z * 2, sourceRowPitch, sourceDepthPitch); 85*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, 0, 0, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 86*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, 0, 0, z, destRowPitch, destDepthPitch); 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker T::average(dst, src0, src1); 89*8975f5c5SAndroid Build Coastguard Worker } 90*8975f5c5SAndroid Build Coastguard Worker} 91*8975f5c5SAndroid Build Coastguard Worker 92*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 93*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_XY(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 94*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 95*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 96*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 97*8975f5c5SAndroid Build Coastguard Worker{ 98*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth > 1); 99*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight > 1); 100*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth == 1); 101*8975f5c5SAndroid Build Coastguard Worker 102*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < destHeight; y++) 103*8975f5c5SAndroid Build Coastguard Worker { 104*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < destWidth; x++) 105*8975f5c5SAndroid Build Coastguard Worker { 106*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, x * 2, y * 2, 0, sourceRowPitch, sourceDepthPitch); 107*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, x * 2, y * 2 + 1, 0, sourceRowPitch, sourceDepthPitch); 108*8975f5c5SAndroid Build Coastguard Worker const T *src2 = GetPixel<T>(sourceData, x * 2 + 1, y * 2, 0, sourceRowPitch, sourceDepthPitch); 109*8975f5c5SAndroid Build Coastguard Worker const T *src3 = GetPixel<T>(sourceData, x * 2 + 1, y * 2 + 1, 0, sourceRowPitch, sourceDepthPitch); 110*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, x, y, 0, destRowPitch, destDepthPitch); 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker T tmp0, tmp1; 113*8975f5c5SAndroid Build Coastguard Worker 114*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp0, src0, src1); 115*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp1, src2, src3); 116*8975f5c5SAndroid Build Coastguard Worker T::average(dst, &tmp0, &tmp1); 117*8975f5c5SAndroid Build Coastguard Worker } 118*8975f5c5SAndroid Build Coastguard Worker } 119*8975f5c5SAndroid Build Coastguard Worker} 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 122*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_YZ(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 123*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 124*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 125*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 126*8975f5c5SAndroid Build Coastguard Worker{ 127*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth == 1); 128*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight > 1); 129*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth > 1); 130*8975f5c5SAndroid Build Coastguard Worker 131*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < destDepth; z++) 132*8975f5c5SAndroid Build Coastguard Worker { 133*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < destHeight; y++) 134*8975f5c5SAndroid Build Coastguard Worker { 135*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, 0, y * 2, z * 2, sourceRowPitch, sourceDepthPitch); 136*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, 0, y * 2, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 137*8975f5c5SAndroid Build Coastguard Worker const T *src2 = GetPixel<T>(sourceData, 0, y * 2 + 1, z * 2, sourceRowPitch, sourceDepthPitch); 138*8975f5c5SAndroid Build Coastguard Worker const T *src3 = GetPixel<T>(sourceData, 0, y * 2 + 1, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 139*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, 0, y, z, destRowPitch, destDepthPitch); 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Worker T tmp0, tmp1; 142*8975f5c5SAndroid Build Coastguard Worker 143*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp0, src0, src1); 144*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp1, src2, src3); 145*8975f5c5SAndroid Build Coastguard Worker T::average(dst, &tmp0, &tmp1); 146*8975f5c5SAndroid Build Coastguard Worker } 147*8975f5c5SAndroid Build Coastguard Worker } 148*8975f5c5SAndroid Build Coastguard Worker} 149*8975f5c5SAndroid Build Coastguard Worker 150*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 151*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_XZ(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 152*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 153*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 154*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 155*8975f5c5SAndroid Build Coastguard Worker{ 156*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth > 1); 157*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight == 1); 158*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth > 1); 159*8975f5c5SAndroid Build Coastguard Worker 160*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < destDepth; z++) 161*8975f5c5SAndroid Build Coastguard Worker { 162*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < destWidth; x++) 163*8975f5c5SAndroid Build Coastguard Worker { 164*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, x * 2, 0, z * 2, sourceRowPitch, sourceDepthPitch); 165*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, x * 2, 0, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 166*8975f5c5SAndroid Build Coastguard Worker const T *src2 = GetPixel<T>(sourceData, x * 2 + 1, 0, z * 2, sourceRowPitch, sourceDepthPitch); 167*8975f5c5SAndroid Build Coastguard Worker const T *src3 = GetPixel<T>(sourceData, x * 2 + 1, 0, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 168*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, x, 0, z, destRowPitch, destDepthPitch); 169*8975f5c5SAndroid Build Coastguard Worker 170*8975f5c5SAndroid Build Coastguard Worker T tmp0, tmp1; 171*8975f5c5SAndroid Build Coastguard Worker 172*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp0, src0, src1); 173*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp1, src2, src3); 174*8975f5c5SAndroid Build Coastguard Worker T::average(dst, &tmp0, &tmp1); 175*8975f5c5SAndroid Build Coastguard Worker } 176*8975f5c5SAndroid Build Coastguard Worker } 177*8975f5c5SAndroid Build Coastguard Worker} 178*8975f5c5SAndroid Build Coastguard Worker 179*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 180*8975f5c5SAndroid Build Coastguard Workerstatic void GenerateMip_XYZ(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 181*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 182*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 183*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 184*8975f5c5SAndroid Build Coastguard Worker{ 185*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceWidth > 1); 186*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceHeight > 1); 187*8975f5c5SAndroid Build Coastguard Worker ASSERT(sourceDepth > 1); 188*8975f5c5SAndroid Build Coastguard Worker 189*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < destDepth; z++) 190*8975f5c5SAndroid Build Coastguard Worker { 191*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < destHeight; y++) 192*8975f5c5SAndroid Build Coastguard Worker { 193*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < destWidth; x++) 194*8975f5c5SAndroid Build Coastguard Worker { 195*8975f5c5SAndroid Build Coastguard Worker const T *src0 = GetPixel<T>(sourceData, x * 2, y * 2, z * 2, sourceRowPitch, sourceDepthPitch); 196*8975f5c5SAndroid Build Coastguard Worker const T *src1 = GetPixel<T>(sourceData, x * 2, y * 2, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 197*8975f5c5SAndroid Build Coastguard Worker const T *src2 = GetPixel<T>(sourceData, x * 2, y * 2 + 1, z * 2, sourceRowPitch, sourceDepthPitch); 198*8975f5c5SAndroid Build Coastguard Worker const T *src3 = GetPixel<T>(sourceData, x * 2, y * 2 + 1, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 199*8975f5c5SAndroid Build Coastguard Worker const T *src4 = GetPixel<T>(sourceData, x * 2 + 1, y * 2, z * 2, sourceRowPitch, sourceDepthPitch); 200*8975f5c5SAndroid Build Coastguard Worker const T *src5 = GetPixel<T>(sourceData, x * 2 + 1, y * 2, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 201*8975f5c5SAndroid Build Coastguard Worker const T *src6 = GetPixel<T>(sourceData, x * 2 + 1, y * 2 + 1, z * 2, sourceRowPitch, sourceDepthPitch); 202*8975f5c5SAndroid Build Coastguard Worker const T *src7 = GetPixel<T>(sourceData, x * 2 + 1, y * 2 + 1, z * 2 + 1, sourceRowPitch, sourceDepthPitch); 203*8975f5c5SAndroid Build Coastguard Worker T *dst = GetPixel<T>(destData, x, y, z, destRowPitch, destDepthPitch); 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker T tmp0, tmp1, tmp2, tmp3, tmp4, tmp5; 206*8975f5c5SAndroid Build Coastguard Worker 207*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp0, src0, src1); 208*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp1, src2, src3); 209*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp2, src4, src5); 210*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp3, src6, src7); 211*8975f5c5SAndroid Build Coastguard Worker 212*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp4, &tmp0, &tmp1); 213*8975f5c5SAndroid Build Coastguard Worker T::average(&tmp5, &tmp2, &tmp3); 214*8975f5c5SAndroid Build Coastguard Worker 215*8975f5c5SAndroid Build Coastguard Worker T::average(dst, &tmp4, &tmp5); 216*8975f5c5SAndroid Build Coastguard Worker } 217*8975f5c5SAndroid Build Coastguard Worker } 218*8975f5c5SAndroid Build Coastguard Worker } 219*8975f5c5SAndroid Build Coastguard Worker} 220*8975f5c5SAndroid Build Coastguard Worker 221*8975f5c5SAndroid Build Coastguard Worker 222*8975f5c5SAndroid Build Coastguard Workertypedef void (*MipGenerationFunction)(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 223*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 224*8975f5c5SAndroid Build Coastguard Worker size_t destWidth, size_t destHeight, size_t destDepth, 225*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch); 226*8975f5c5SAndroid Build Coastguard Worker 227*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 228*8975f5c5SAndroid Build Coastguard Workerstatic MipGenerationFunction GetMipGenerationFunction(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth) 229*8975f5c5SAndroid Build Coastguard Worker{ 230*8975f5c5SAndroid Build Coastguard Worker uint8_t index = ((sourceWidth > 1) ? 1 : 0) | 231*8975f5c5SAndroid Build Coastguard Worker ((sourceHeight > 1) ? 2 : 0) | 232*8975f5c5SAndroid Build Coastguard Worker ((sourceDepth > 1) ? 4 : 0); 233*8975f5c5SAndroid Build Coastguard Worker 234*8975f5c5SAndroid Build Coastguard Worker switch (index) 235*8975f5c5SAndroid Build Coastguard Worker { 236*8975f5c5SAndroid Build Coastguard Worker case 0: return nullptr; 237*8975f5c5SAndroid Build Coastguard Worker case 1: return GenerateMip_X<T>; // W x 1 x 1 238*8975f5c5SAndroid Build Coastguard Worker case 2: return GenerateMip_Y<T>; // 1 x H x 1 239*8975f5c5SAndroid Build Coastguard Worker case 3: return GenerateMip_XY<T>; // W x H x 1 240*8975f5c5SAndroid Build Coastguard Worker case 4: return GenerateMip_Z<T>; // 1 x 1 x D 241*8975f5c5SAndroid Build Coastguard Worker case 5: return GenerateMip_XZ<T>; // W x 1 x D 242*8975f5c5SAndroid Build Coastguard Worker case 6: return GenerateMip_YZ<T>; // 1 x H x D 243*8975f5c5SAndroid Build Coastguard Worker case 7: return GenerateMip_XYZ<T>; // W x H x D 244*8975f5c5SAndroid Build Coastguard Worker } 245*8975f5c5SAndroid Build Coastguard Worker 246*8975f5c5SAndroid Build Coastguard Worker UNREACHABLE(); 247*8975f5c5SAndroid Build Coastguard Worker return nullptr; 248*8975f5c5SAndroid Build Coastguard Worker} 249*8975f5c5SAndroid Build Coastguard Worker 250*8975f5c5SAndroid Build Coastguard Worker} // namespace priv 251*8975f5c5SAndroid Build Coastguard Worker 252*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 253*8975f5c5SAndroid Build Coastguard Workerinline void GenerateMip(size_t sourceWidth, size_t sourceHeight, size_t sourceDepth, 254*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData, size_t sourceRowPitch, size_t sourceDepthPitch, 255*8975f5c5SAndroid Build Coastguard Worker uint8_t *destData, size_t destRowPitch, size_t destDepthPitch) 256*8975f5c5SAndroid Build Coastguard Worker{ 257*8975f5c5SAndroid Build Coastguard Worker size_t mipWidth = std::max<size_t>(1, sourceWidth >> 1); 258*8975f5c5SAndroid Build Coastguard Worker size_t mipHeight = std::max<size_t>(1, sourceHeight >> 1); 259*8975f5c5SAndroid Build Coastguard Worker size_t mipDepth = std::max<size_t>(1, sourceDepth >> 1); 260*8975f5c5SAndroid Build Coastguard Worker 261*8975f5c5SAndroid Build Coastguard Worker priv::MipGenerationFunction generationFunction = priv::GetMipGenerationFunction<T>(sourceWidth, sourceHeight, sourceDepth); 262*8975f5c5SAndroid Build Coastguard Worker ASSERT(generationFunction != nullptr); 263*8975f5c5SAndroid Build Coastguard Worker 264*8975f5c5SAndroid Build Coastguard Worker generationFunction(sourceWidth, sourceHeight, sourceDepth, sourceData, sourceRowPitch, sourceDepthPitch, 265*8975f5c5SAndroid Build Coastguard Worker mipWidth, mipHeight, mipDepth, destData, destRowPitch, destDepthPitch); 266*8975f5c5SAndroid Build Coastguard Worker} 267*8975f5c5SAndroid Build Coastguard Worker 268*8975f5c5SAndroid Build Coastguard Worker} // namespace angle 269