1*8975f5c5SAndroid Build Coastguard Worker// 2*8975f5c5SAndroid Build Coastguard Worker// Copyright 2014 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#include "common/mathutil.h" 8*8975f5c5SAndroid Build Coastguard Worker 9*8975f5c5SAndroid Build Coastguard Worker#include <string.h> 10*8975f5c5SAndroid Build Coastguard Worker 11*8975f5c5SAndroid Build Coastguard Workernamespace angle 12*8975f5c5SAndroid Build Coastguard Worker{ 13*8975f5c5SAndroid Build Coastguard Worker 14*8975f5c5SAndroid Build Coastguard Workernamespace priv 15*8975f5c5SAndroid Build Coastguard Worker{ 16*8975f5c5SAndroid Build Coastguard Worker 17*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 18*8975f5c5SAndroid Build Coastguard Workerinline T *OffsetDataPointer(uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch) 19*8975f5c5SAndroid Build Coastguard Worker{ 20*8975f5c5SAndroid Build Coastguard Worker return reinterpret_cast<T*>(data + (y * rowPitch) + (z * depthPitch)); 21*8975f5c5SAndroid Build Coastguard Worker} 22*8975f5c5SAndroid Build Coastguard Worker 23*8975f5c5SAndroid Build Coastguard Workertemplate <typename T> 24*8975f5c5SAndroid Build Coastguard Workerinline const T *OffsetDataPointer(const uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch) 25*8975f5c5SAndroid Build Coastguard Worker{ 26*8975f5c5SAndroid Build Coastguard Worker return reinterpret_cast<const T*>(data + (y * rowPitch) + (z * depthPitch)); 27*8975f5c5SAndroid Build Coastguard Worker} 28*8975f5c5SAndroid Build Coastguard Worker 29*8975f5c5SAndroid Build Coastguard Worker} // namespace priv 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, size_t componentCount> 32*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative(const ImageLoadContext &context, size_t width, size_t height, size_t depth, 33*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch, 34*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) 35*8975f5c5SAndroid Build Coastguard Worker{ 36*8975f5c5SAndroid Build Coastguard Worker const size_t rowSize = width * sizeof(type) * componentCount; 37*8975f5c5SAndroid Build Coastguard Worker const size_t layerSize = rowSize * height; 38*8975f5c5SAndroid Build Coastguard Worker const size_t imageSize = layerSize * depth; 39*8975f5c5SAndroid Build Coastguard Worker 40*8975f5c5SAndroid Build Coastguard Worker if (layerSize == inputDepthPitch && layerSize == outputDepthPitch) 41*8975f5c5SAndroid Build Coastguard Worker { 42*8975f5c5SAndroid Build Coastguard Worker ASSERT(rowSize == inputRowPitch && rowSize == outputRowPitch); 43*8975f5c5SAndroid Build Coastguard Worker memcpy(output, input, imageSize); 44*8975f5c5SAndroid Build Coastguard Worker } 45*8975f5c5SAndroid Build Coastguard Worker else if (rowSize == inputRowPitch && rowSize == outputRowPitch) 46*8975f5c5SAndroid Build Coastguard Worker { 47*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 48*8975f5c5SAndroid Build Coastguard Worker { 49*8975f5c5SAndroid Build Coastguard Worker const type *source = priv::OffsetDataPointer<type>(input, 0, z, inputRowPitch, inputDepthPitch); 50*8975f5c5SAndroid Build Coastguard Worker type *dest = priv::OffsetDataPointer<type>(output, 0, z, outputRowPitch, outputDepthPitch); 51*8975f5c5SAndroid Build Coastguard Worker 52*8975f5c5SAndroid Build Coastguard Worker memcpy(dest, source, layerSize); 53*8975f5c5SAndroid Build Coastguard Worker } 54*8975f5c5SAndroid Build Coastguard Worker } 55*8975f5c5SAndroid Build Coastguard Worker else 56*8975f5c5SAndroid Build Coastguard Worker { 57*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 58*8975f5c5SAndroid Build Coastguard Worker { 59*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 60*8975f5c5SAndroid Build Coastguard Worker { 61*8975f5c5SAndroid Build Coastguard Worker const type *source = priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch); 62*8975f5c5SAndroid Build Coastguard Worker type *dest = priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch); 63*8975f5c5SAndroid Build Coastguard Worker memcpy(dest, source, width * sizeof(type) * componentCount); 64*8975f5c5SAndroid Build Coastguard Worker } 65*8975f5c5SAndroid Build Coastguard Worker } 66*8975f5c5SAndroid Build Coastguard Worker } 67*8975f5c5SAndroid Build Coastguard Worker} 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Workertemplate <typename type> 70*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4Impl(const ImageLoadContext &context, 71*8975f5c5SAndroid Build Coastguard Worker const uint32_t fourthComponentBits, 72*8975f5c5SAndroid Build Coastguard Worker size_t width, 73*8975f5c5SAndroid Build Coastguard Worker size_t height, 74*8975f5c5SAndroid Build Coastguard Worker size_t depth, 75*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 76*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 77*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 78*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 79*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 80*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 81*8975f5c5SAndroid Build Coastguard Worker{ 82*8975f5c5SAndroid Build Coastguard Worker const type fourthValue = gl::bitCast<type>(fourthComponentBits); 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 85*8975f5c5SAndroid Build Coastguard Worker { 86*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 87*8975f5c5SAndroid Build Coastguard Worker { 88*8975f5c5SAndroid Build Coastguard Worker const type *source = 89*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch); 90*8975f5c5SAndroid Build Coastguard Worker type *dest = 91*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch); 92*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++) 93*8975f5c5SAndroid Build Coastguard Worker { 94*8975f5c5SAndroid Build Coastguard Worker memcpy(&dest[x * 4], &source[x * 3], sizeof(type) * 3); 95*8975f5c5SAndroid Build Coastguard Worker dest[x * 4 + 3] = fourthValue; 96*8975f5c5SAndroid Build Coastguard Worker } 97*8975f5c5SAndroid Build Coastguard Worker } 98*8975f5c5SAndroid Build Coastguard Worker } 99*8975f5c5SAndroid Build Coastguard Worker} 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, uint32_t fourthComponentBits> 102*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4(const ImageLoadContext &context, 103*8975f5c5SAndroid Build Coastguard Worker size_t width, 104*8975f5c5SAndroid Build Coastguard Worker size_t height, 105*8975f5c5SAndroid Build Coastguard Worker size_t depth, 106*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 107*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 108*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 109*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 110*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 111*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 112*8975f5c5SAndroid Build Coastguard Worker{ 113*8975f5c5SAndroid Build Coastguard Worker LoadToNative3To4Impl<type>(context, fourthComponentBits, width, height, depth, input, 114*8975f5c5SAndroid Build Coastguard Worker inputRowPitch, inputDepthPitch, output, outputRowPitch, 115*8975f5c5SAndroid Build Coastguard Worker outputDepthPitch); 116*8975f5c5SAndroid Build Coastguard Worker} 117*8975f5c5SAndroid Build Coastguard Worker 118*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNativeByte3To4Impl(const ImageLoadContext &context, 119*8975f5c5SAndroid Build Coastguard Worker const uint8_t fourthValue, 120*8975f5c5SAndroid Build Coastguard Worker size_t width, 121*8975f5c5SAndroid Build Coastguard Worker size_t height, 122*8975f5c5SAndroid Build Coastguard Worker size_t depth, 123*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 124*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 125*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 126*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 127*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 128*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 129*8975f5c5SAndroid Build Coastguard Worker{ 130*8975f5c5SAndroid Build Coastguard Worker // This function is used for both signed and unsigned byte copies. 131*8975f5c5SAndroid Build Coastguard Worker ASSERT(IsLittleEndian()); 132*8975f5c5SAndroid Build Coastguard Worker uint32_t fourthValue32 = static_cast<uint32_t>(fourthValue) << 24; 133*8975f5c5SAndroid Build Coastguard Worker 134*8975f5c5SAndroid Build Coastguard Worker // To prevent undefined behavior, if the output address is not aligned by 4, the copy would be 135*8975f5c5SAndroid Build Coastguard Worker // done using the default function instead. 136*8975f5c5SAndroid Build Coastguard Worker if (reinterpret_cast<uintptr_t>(output) % 4 != 0) 137*8975f5c5SAndroid Build Coastguard Worker { 138*8975f5c5SAndroid Build Coastguard Worker LoadToNative3To4Impl<uint8_t>(context, fourthValue, width, height, depth, input, 139*8975f5c5SAndroid Build Coastguard Worker inputRowPitch, inputDepthPitch, output, outputRowPitch, 140*8975f5c5SAndroid Build Coastguard Worker outputDepthPitch); 141*8975f5c5SAndroid Build Coastguard Worker return; 142*8975f5c5SAndroid Build Coastguard Worker } 143*8975f5c5SAndroid Build Coastguard Worker 144*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 145*8975f5c5SAndroid Build Coastguard Worker { 146*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 147*8975f5c5SAndroid Build Coastguard Worker { 148*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source8 = 149*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch); 150*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest8 = 151*8975f5c5SAndroid Build Coastguard Worker priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch); 152*8975f5c5SAndroid Build Coastguard Worker 153*8975f5c5SAndroid Build Coastguard Worker // If the uint8_t addresses are not aligned to 4 bytes, there may be undefined behavior 154*8975f5c5SAndroid Build Coastguard Worker // if they are used to copy 32-bit data. In that case, pixels are copied to the output 155*8975f5c5SAndroid Build Coastguard Worker // one at a time until 4-byte alignment has been achieved for the source. 156*8975f5c5SAndroid Build Coastguard Worker size_t pixelIndex = 0; 157*8975f5c5SAndroid Build Coastguard Worker 158*8975f5c5SAndroid Build Coastguard Worker uint32_t source4Mod = reinterpret_cast<uintptr_t>(source8) % 4; 159*8975f5c5SAndroid Build Coastguard Worker while (source4Mod != 0 && pixelIndex < width) 160*8975f5c5SAndroid Build Coastguard Worker { 161*8975f5c5SAndroid Build Coastguard Worker dest8[0] = source8[0]; 162*8975f5c5SAndroid Build Coastguard Worker dest8[1] = source8[1]; 163*8975f5c5SAndroid Build Coastguard Worker dest8[2] = source8[2]; 164*8975f5c5SAndroid Build Coastguard Worker dest8[3] = fourthValue; 165*8975f5c5SAndroid Build Coastguard Worker 166*8975f5c5SAndroid Build Coastguard Worker source8 += 3; 167*8975f5c5SAndroid Build Coastguard Worker source4Mod = (source4Mod + 3) % 4; 168*8975f5c5SAndroid Build Coastguard Worker dest8 += 4; 169*8975f5c5SAndroid Build Coastguard Worker pixelIndex++; 170*8975f5c5SAndroid Build Coastguard Worker } 171*8975f5c5SAndroid Build Coastguard Worker 172*8975f5c5SAndroid Build Coastguard Worker if (pixelIndex == width) 173*8975f5c5SAndroid Build Coastguard Worker { 174*8975f5c5SAndroid Build Coastguard Worker continue; 175*8975f5c5SAndroid Build Coastguard Worker } 176*8975f5c5SAndroid Build Coastguard Worker 177*8975f5c5SAndroid Build Coastguard Worker // In the following loop, 4 RGB pixels will be read in each iteration. If the remaining 178*8975f5c5SAndroid Build Coastguard Worker // pixels are not a multiple of 4, the rest at the end of the row will be copied one at 179*8975f5c5SAndroid Build Coastguard Worker // a time. 180*8975f5c5SAndroid Build Coastguard Worker const uint32_t *source32 = reinterpret_cast<const uint32_t *>(source8); 181*8975f5c5SAndroid Build Coastguard Worker uint32_t *dest32 = reinterpret_cast<uint32_t *>(dest8); 182*8975f5c5SAndroid Build Coastguard Worker 183*8975f5c5SAndroid Build Coastguard Worker size_t remainingWidth = width - pixelIndex; 184*8975f5c5SAndroid Build Coastguard Worker if (remainingWidth >= 4) 185*8975f5c5SAndroid Build Coastguard Worker { 186*8975f5c5SAndroid Build Coastguard Worker size_t fourByteCopyThreshold = remainingWidth - 4; 187*8975f5c5SAndroid Build Coastguard Worker for (; pixelIndex <= fourByteCopyThreshold; pixelIndex += 4) 188*8975f5c5SAndroid Build Coastguard Worker { 189*8975f5c5SAndroid Build Coastguard Worker // Three 32-bit values from the input contain 4 RGB pixels in total. This 190*8975f5c5SAndroid Build Coastguard Worker // translates to four 32-bits on the output. 191*8975f5c5SAndroid Build Coastguard Worker // (RGBR GBRG BRGB -> RGBA RGBA RGBA RGBA) 192*8975f5c5SAndroid Build Coastguard Worker uint32_t newPixelData[3]; 193*8975f5c5SAndroid Build Coastguard Worker uint32_t rgbaPixelData[4]; 194*8975f5c5SAndroid Build Coastguard Worker memcpy(&newPixelData[0], &source32[0], sizeof(uint32_t) * 3); 195*8975f5c5SAndroid Build Coastguard Worker 196*8975f5c5SAndroid Build Coastguard Worker rgbaPixelData[0] = (newPixelData[0] & 0x00FFFFFF) | fourthValue32; 197*8975f5c5SAndroid Build Coastguard Worker rgbaPixelData[1] = (newPixelData[0] >> 24) | 198*8975f5c5SAndroid Build Coastguard Worker ((newPixelData[1] & 0x0000FFFF) << 8) | fourthValue32; 199*8975f5c5SAndroid Build Coastguard Worker rgbaPixelData[2] = (newPixelData[1] >> 16) | 200*8975f5c5SAndroid Build Coastguard Worker ((newPixelData[2] & 0x000000FF) << 16) | fourthValue32; 201*8975f5c5SAndroid Build Coastguard Worker rgbaPixelData[3] = (newPixelData[2] >> 8) | fourthValue32; 202*8975f5c5SAndroid Build Coastguard Worker 203*8975f5c5SAndroid Build Coastguard Worker memcpy(&dest32[0], &rgbaPixelData[0], sizeof(uint32_t) * 4); 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker source32 += 3; 206*8975f5c5SAndroid Build Coastguard Worker dest32 += 4; 207*8975f5c5SAndroid Build Coastguard Worker } 208*8975f5c5SAndroid Build Coastguard Worker } 209*8975f5c5SAndroid Build Coastguard Worker 210*8975f5c5SAndroid Build Coastguard Worker // We should copy the remaining pixels at the end one by one. 211*8975f5c5SAndroid Build Coastguard Worker source8 = reinterpret_cast<const uint8_t *>(source32); 212*8975f5c5SAndroid Build Coastguard Worker dest8 = reinterpret_cast<uint8_t *>(dest32); 213*8975f5c5SAndroid Build Coastguard Worker for (; pixelIndex < width; pixelIndex++) 214*8975f5c5SAndroid Build Coastguard Worker { 215*8975f5c5SAndroid Build Coastguard Worker dest8[0] = source8[0]; 216*8975f5c5SAndroid Build Coastguard Worker dest8[1] = source8[1]; 217*8975f5c5SAndroid Build Coastguard Worker dest8[2] = source8[2]; 218*8975f5c5SAndroid Build Coastguard Worker dest8[3] = fourthValue; 219*8975f5c5SAndroid Build Coastguard Worker 220*8975f5c5SAndroid Build Coastguard Worker source8 += 3; 221*8975f5c5SAndroid Build Coastguard Worker dest8 += 4; 222*8975f5c5SAndroid Build Coastguard Worker } 223*8975f5c5SAndroid Build Coastguard Worker } 224*8975f5c5SAndroid Build Coastguard Worker } 225*8975f5c5SAndroid Build Coastguard Worker} 226*8975f5c5SAndroid Build Coastguard Worker 227*8975f5c5SAndroid Build Coastguard Workertemplate <> 228*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<uint8_t, 0xFF>(const ImageLoadContext &context, 229*8975f5c5SAndroid Build Coastguard Worker size_t width, 230*8975f5c5SAndroid Build Coastguard Worker size_t height, 231*8975f5c5SAndroid Build Coastguard Worker size_t depth, 232*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 233*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 234*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 235*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 236*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 237*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 238*8975f5c5SAndroid Build Coastguard Worker{ 239*8975f5c5SAndroid Build Coastguard Worker LoadToNativeByte3To4Impl(context, 0xFF, width, height, depth, input, inputRowPitch, 240*8975f5c5SAndroid Build Coastguard Worker inputDepthPitch, output, outputRowPitch, outputDepthPitch); 241*8975f5c5SAndroid Build Coastguard Worker} 242*8975f5c5SAndroid Build Coastguard Worker 243*8975f5c5SAndroid Build Coastguard Workertemplate <> 244*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<uint8_t, 0x01>(const ImageLoadContext &context, 245*8975f5c5SAndroid Build Coastguard Worker size_t width, 246*8975f5c5SAndroid Build Coastguard Worker size_t height, 247*8975f5c5SAndroid Build Coastguard Worker size_t depth, 248*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 249*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 250*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 251*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 252*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 253*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 254*8975f5c5SAndroid Build Coastguard Worker{ 255*8975f5c5SAndroid Build Coastguard Worker LoadToNativeByte3To4Impl(context, 0x01, width, height, depth, input, inputRowPitch, 256*8975f5c5SAndroid Build Coastguard Worker inputDepthPitch, output, outputRowPitch, outputDepthPitch); 257*8975f5c5SAndroid Build Coastguard Worker} 258*8975f5c5SAndroid Build Coastguard Worker 259*8975f5c5SAndroid Build Coastguard Workertemplate <> 260*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<int8_t, 0x01>(const ImageLoadContext &context, 261*8975f5c5SAndroid Build Coastguard Worker size_t width, 262*8975f5c5SAndroid Build Coastguard Worker size_t height, 263*8975f5c5SAndroid Build Coastguard Worker size_t depth, 264*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 265*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 266*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 267*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 268*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 269*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 270*8975f5c5SAndroid Build Coastguard Worker{ 271*8975f5c5SAndroid Build Coastguard Worker LoadToNativeByte3To4Impl(context, 0x01, width, height, depth, input, inputRowPitch, 272*8975f5c5SAndroid Build Coastguard Worker inputDepthPitch, output, outputRowPitch, outputDepthPitch); 273*8975f5c5SAndroid Build Coastguard Worker} 274*8975f5c5SAndroid Build Coastguard Worker 275*8975f5c5SAndroid Build Coastguard Workertemplate <> 276*8975f5c5SAndroid Build Coastguard Workerinline void LoadToNative3To4<int8_t, 0x7F>(const ImageLoadContext &context, 277*8975f5c5SAndroid Build Coastguard Worker size_t width, 278*8975f5c5SAndroid Build Coastguard Worker size_t height, 279*8975f5c5SAndroid Build Coastguard Worker size_t depth, 280*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 281*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 282*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 283*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 284*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 285*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 286*8975f5c5SAndroid Build Coastguard Worker{ 287*8975f5c5SAndroid Build Coastguard Worker LoadToNativeByte3To4Impl(context, 0x7F, width, height, depth, input, inputRowPitch, 288*8975f5c5SAndroid Build Coastguard Worker inputDepthPitch, output, outputRowPitch, outputDepthPitch); 289*8975f5c5SAndroid Build Coastguard Worker} 290*8975f5c5SAndroid Build Coastguard Worker 291*8975f5c5SAndroid Build Coastguard Workertemplate <size_t componentCount> 292*8975f5c5SAndroid Build Coastguard Workerinline void Load32FTo16F(const ImageLoadContext &context, size_t width, size_t height, size_t depth, 293*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch, 294*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) 295*8975f5c5SAndroid Build Coastguard Worker{ 296*8975f5c5SAndroid Build Coastguard Worker const size_t elementWidth = componentCount * width; 297*8975f5c5SAndroid Build Coastguard Worker 298*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 299*8975f5c5SAndroid Build Coastguard Worker { 300*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 301*8975f5c5SAndroid Build Coastguard Worker { 302*8975f5c5SAndroid Build Coastguard Worker const float *source = priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch); 303*8975f5c5SAndroid Build Coastguard Worker uint16_t *dest = priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch); 304*8975f5c5SAndroid Build Coastguard Worker 305*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < elementWidth; x++) 306*8975f5c5SAndroid Build Coastguard Worker { 307*8975f5c5SAndroid Build Coastguard Worker dest[x] = gl::float32ToFloat16(source[x]); 308*8975f5c5SAndroid Build Coastguard Worker } 309*8975f5c5SAndroid Build Coastguard Worker } 310*8975f5c5SAndroid Build Coastguard Worker } 311*8975f5c5SAndroid Build Coastguard Worker} 312*8975f5c5SAndroid Build Coastguard Worker 313*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, 314*8975f5c5SAndroid Build Coastguard Worker size_t inputComponentCount, 315*8975f5c5SAndroid Build Coastguard Worker size_t outputComponentCount, 316*8975f5c5SAndroid Build Coastguard Worker bool normalized> 317*8975f5c5SAndroid Build Coastguard Workerinline void LoadToFloat(const ImageLoadContext &context, size_t width, size_t height, size_t depth, 318*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch, 319*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) { 320*8975f5c5SAndroid Build Coastguard Worker typedef std::numeric_limits<type> NL; 321*8975f5c5SAndroid Build Coastguard Worker 322*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 323*8975f5c5SAndroid Build Coastguard Worker { 324*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 325*8975f5c5SAndroid Build Coastguard Worker { 326*8975f5c5SAndroid Build Coastguard Worker const type *source_line = priv::OffsetDataPointer<type>(input, y, z, inputRowPitch, inputDepthPitch); 327*8975f5c5SAndroid Build Coastguard Worker float *dest_line = priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch); 328*8975f5c5SAndroid Build Coastguard Worker 329*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++) 330*8975f5c5SAndroid Build Coastguard Worker { 331*8975f5c5SAndroid Build Coastguard Worker const type *source_pixel = source_line + x * inputComponentCount; 332*8975f5c5SAndroid Build Coastguard Worker float *dest_pixel = dest_line + x * outputComponentCount; 333*8975f5c5SAndroid Build Coastguard Worker 334*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < inputComponentCount; i++) 335*8975f5c5SAndroid Build Coastguard Worker { 336*8975f5c5SAndroid Build Coastguard Worker float result = 0; 337*8975f5c5SAndroid Build Coastguard Worker if (normalized) 338*8975f5c5SAndroid Build Coastguard Worker { 339*8975f5c5SAndroid Build Coastguard Worker if (NL::is_signed) 340*8975f5c5SAndroid Build Coastguard Worker { 341*8975f5c5SAndroid Build Coastguard Worker result = static_cast<float>(source_pixel[i]) / static_cast<float>(NL::max()); 342*8975f5c5SAndroid Build Coastguard Worker result = result >= -1.0f ? result : -1.0f; 343*8975f5c5SAndroid Build Coastguard Worker } 344*8975f5c5SAndroid Build Coastguard Worker else 345*8975f5c5SAndroid Build Coastguard Worker { 346*8975f5c5SAndroid Build Coastguard Worker result = static_cast<float>(source_pixel[i]) / static_cast<float>(NL::max()); 347*8975f5c5SAndroid Build Coastguard Worker } 348*8975f5c5SAndroid Build Coastguard Worker } 349*8975f5c5SAndroid Build Coastguard Worker else 350*8975f5c5SAndroid Build Coastguard Worker { 351*8975f5c5SAndroid Build Coastguard Worker result = static_cast<float>(source_pixel[i]); 352*8975f5c5SAndroid Build Coastguard Worker } 353*8975f5c5SAndroid Build Coastguard Worker dest_pixel[i] = result; 354*8975f5c5SAndroid Build Coastguard Worker } 355*8975f5c5SAndroid Build Coastguard Worker 356*8975f5c5SAndroid Build Coastguard Worker for (size_t j = inputComponentCount; j < outputComponentCount; j++) 357*8975f5c5SAndroid Build Coastguard Worker { 358*8975f5c5SAndroid Build Coastguard Worker dest_pixel[j] = j == 3 ? 1.0f : 0.0f; 359*8975f5c5SAndroid Build Coastguard Worker } 360*8975f5c5SAndroid Build Coastguard Worker } 361*8975f5c5SAndroid Build Coastguard Worker } 362*8975f5c5SAndroid Build Coastguard Worker } 363*8975f5c5SAndroid Build Coastguard Worker} 364*8975f5c5SAndroid Build Coastguard Worker 365*8975f5c5SAndroid Build Coastguard Workertemplate <size_t blockWidth, size_t blockHeight, size_t blockDepth, size_t blockSize> 366*8975f5c5SAndroid Build Coastguard Workerinline void LoadCompressedToNative(const ImageLoadContext &context, size_t width, size_t height, 367*8975f5c5SAndroid Build Coastguard Worker size_t depth, const uint8_t *input, size_t inputRowPitch, 368*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, uint8_t *output, size_t outputRowPitch, 369*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 370*8975f5c5SAndroid Build Coastguard Worker{ 371*8975f5c5SAndroid Build Coastguard Worker const size_t columns = (width + (blockWidth - 1)) / blockWidth; 372*8975f5c5SAndroid Build Coastguard Worker const size_t rows = (height + (blockHeight - 1)) / blockHeight; 373*8975f5c5SAndroid Build Coastguard Worker const size_t layers = (depth + (blockDepth - 1)) / blockDepth; 374*8975f5c5SAndroid Build Coastguard Worker 375*8975f5c5SAndroid Build Coastguard Worker const size_t inputLayerSize = inputRowPitch * rows; 376*8975f5c5SAndroid Build Coastguard Worker const size_t inputImageSize = inputDepthPitch * layers; 377*8975f5c5SAndroid Build Coastguard Worker 378*8975f5c5SAndroid Build Coastguard Worker const size_t outputLayerSize = outputRowPitch * rows; 379*8975f5c5SAndroid Build Coastguard Worker const size_t outputImageSize = outputDepthPitch * layers; 380*8975f5c5SAndroid Build Coastguard Worker 381*8975f5c5SAndroid Build Coastguard Worker if (inputImageSize == outputImageSize) 382*8975f5c5SAndroid Build Coastguard Worker { 383*8975f5c5SAndroid Build Coastguard Worker ASSERT(inputRowPitch == outputRowPitch); 384*8975f5c5SAndroid Build Coastguard Worker ASSERT(inputLayerSize == outputLayerSize && inputLayerSize == inputDepthPitch && outputLayerSize == outputDepthPitch); 385*8975f5c5SAndroid Build Coastguard Worker memcpy(output, input, inputImageSize); 386*8975f5c5SAndroid Build Coastguard Worker } 387*8975f5c5SAndroid Build Coastguard Worker else 388*8975f5c5SAndroid Build Coastguard Worker { 389*8975f5c5SAndroid Build Coastguard Worker // Note: this path should technically never be hit, but it is with the d3d backend. Once 390*8975f5c5SAndroid Build Coastguard Worker // the issue is fixed, this path should be removed. 391*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42266773 392*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < layers; ++z) 393*8975f5c5SAndroid Build Coastguard Worker { 394*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < rows; ++y) 395*8975f5c5SAndroid Build Coastguard Worker { 396*8975f5c5SAndroid Build Coastguard Worker const uint8_t *source = priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch); 397*8975f5c5SAndroid Build Coastguard Worker uint8_t *dest = priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch); 398*8975f5c5SAndroid Build Coastguard Worker memcpy(dest, source, columns * blockSize); 399*8975f5c5SAndroid Build Coastguard Worker } 400*8975f5c5SAndroid Build Coastguard Worker } 401*8975f5c5SAndroid Build Coastguard Worker } 402*8975f5c5SAndroid Build Coastguard Worker} 403*8975f5c5SAndroid Build Coastguard Worker 404*8975f5c5SAndroid Build Coastguard Workertemplate <typename type, uint32_t firstBits, uint32_t secondBits, uint32_t thirdBits, uint32_t fourthBits> 405*8975f5c5SAndroid Build Coastguard Workerinline void Initialize4ComponentData(size_t width, size_t height, size_t depth, 406*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch) 407*8975f5c5SAndroid Build Coastguard Worker{ 408*8975f5c5SAndroid Build Coastguard Worker type writeValues[4] = 409*8975f5c5SAndroid Build Coastguard Worker { 410*8975f5c5SAndroid Build Coastguard Worker gl::bitCast<type>(firstBits), 411*8975f5c5SAndroid Build Coastguard Worker gl::bitCast<type>(secondBits), 412*8975f5c5SAndroid Build Coastguard Worker gl::bitCast<type>(thirdBits), 413*8975f5c5SAndroid Build Coastguard Worker gl::bitCast<type>(fourthBits), 414*8975f5c5SAndroid Build Coastguard Worker }; 415*8975f5c5SAndroid Build Coastguard Worker 416*8975f5c5SAndroid Build Coastguard Worker for (size_t z = 0; z < depth; z++) 417*8975f5c5SAndroid Build Coastguard Worker { 418*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++) 419*8975f5c5SAndroid Build Coastguard Worker { 420*8975f5c5SAndroid Build Coastguard Worker type *destRow = priv::OffsetDataPointer<type>(output, y, z, outputRowPitch, outputDepthPitch); 421*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++) 422*8975f5c5SAndroid Build Coastguard Worker { 423*8975f5c5SAndroid Build Coastguard Worker type* destPixel = destRow + x * 4; 424*8975f5c5SAndroid Build Coastguard Worker 425*8975f5c5SAndroid Build Coastguard Worker // This could potentially be optimized by generating an entire row of initialization 426*8975f5c5SAndroid Build Coastguard Worker // data and copying row by row instead of pixel by pixel. 427*8975f5c5SAndroid Build Coastguard Worker memcpy(destPixel, writeValues, sizeof(type) * 4); 428*8975f5c5SAndroid Build Coastguard Worker } 429*8975f5c5SAndroid Build Coastguard Worker } 430*8975f5c5SAndroid Build Coastguard Worker } 431*8975f5c5SAndroid Build Coastguard Worker} 432*8975f5c5SAndroid Build Coastguard Worker 433*8975f5c5SAndroid Build Coastguard Workertemplate <size_t blockWidth, size_t blockHeight> 434*8975f5c5SAndroid Build Coastguard Workerinline void LoadASTCToRGBA8(const ImageLoadContext &context, 435*8975f5c5SAndroid Build Coastguard Worker size_t width, 436*8975f5c5SAndroid Build Coastguard Worker size_t height, 437*8975f5c5SAndroid Build Coastguard Worker size_t depth, 438*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 439*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 440*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 441*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 442*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 443*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 444*8975f5c5SAndroid Build Coastguard Worker{ 445*8975f5c5SAndroid Build Coastguard Worker LoadASTCToRGBA8Inner(context, width, height, depth, blockWidth, blockHeight, input, inputRowPitch, 446*8975f5c5SAndroid Build Coastguard Worker inputDepthPitch, output, outputRowPitch, outputDepthPitch); 447*8975f5c5SAndroid Build Coastguard Worker} 448*8975f5c5SAndroid Build Coastguard Worker 449*8975f5c5SAndroid Build Coastguard Workertemplate <uint32_t indexBits, uint32_t redBlueBits, uint32_t greenBits, uint32_t alphaBits> 450*8975f5c5SAndroid Build Coastguard Workerinline void LoadPalettedToRGBA8(const ImageLoadContext &context, 451*8975f5c5SAndroid Build Coastguard Worker size_t width, 452*8975f5c5SAndroid Build Coastguard Worker size_t height, 453*8975f5c5SAndroid Build Coastguard Worker size_t depth, 454*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 455*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 456*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 457*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 458*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 459*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 460*8975f5c5SAndroid Build Coastguard Worker{ 461*8975f5c5SAndroid Build Coastguard Worker static_assert(indexBits == 4 || indexBits == 8); 462*8975f5c5SAndroid Build Coastguard Worker static_assert(redBlueBits == 4 || redBlueBits == 5 || redBlueBits == 8); 463*8975f5c5SAndroid Build Coastguard Worker static_assert(greenBits == 4 || greenBits == 5 || greenBits == 6 || greenBits == 8); 464*8975f5c5SAndroid Build Coastguard Worker static_assert(alphaBits == 0 || alphaBits == 1 || alphaBits == 4 || alphaBits == 8); 465*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t colorBits = 2 * redBlueBits + greenBits + alphaBits; 466*8975f5c5SAndroid Build Coastguard Worker static_assert(colorBits == 16 || colorBits == 24 || colorBits == 32); 467*8975f5c5SAndroid Build Coastguard Worker 468*8975f5c5SAndroid Build Coastguard Worker LoadPalettedToRGBA8Impl(context, width, height, depth, 469*8975f5c5SAndroid Build Coastguard Worker indexBits, redBlueBits, greenBits, alphaBits, 470*8975f5c5SAndroid Build Coastguard Worker input, inputRowPitch, inputDepthPitch, 471*8975f5c5SAndroid Build Coastguard Worker output, outputRowPitch, outputDepthPitch); 472*8975f5c5SAndroid Build Coastguard Worker} 473*8975f5c5SAndroid Build Coastguard Worker 474*8975f5c5SAndroid Build Coastguard Worker// Temporary overload functions; need to have no-context overloads of the following functions used 475*8975f5c5SAndroid Build Coastguard Worker// by Chromium. A Chromium change will switch to the with-context overloads, and then these can be 476*8975f5c5SAndroid Build Coastguard Worker// removed. 477*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACR11ToR8(size_t width, 478*8975f5c5SAndroid Build Coastguard Worker size_t height, 479*8975f5c5SAndroid Build Coastguard Worker size_t depth, 480*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 481*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 482*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 483*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 484*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 485*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 486*8975f5c5SAndroid Build Coastguard Worker{ 487*8975f5c5SAndroid Build Coastguard Worker LoadEACR11ToR8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 488*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 489*8975f5c5SAndroid Build Coastguard Worker} 490*8975f5c5SAndroid Build Coastguard Worker 491*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACR11SToR8(size_t width, 492*8975f5c5SAndroid Build Coastguard Worker size_t height, 493*8975f5c5SAndroid Build Coastguard Worker size_t depth, 494*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 495*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 496*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 497*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 498*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 499*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 500*8975f5c5SAndroid Build Coastguard Worker{ 501*8975f5c5SAndroid Build Coastguard Worker LoadEACR11SToR8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 502*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 503*8975f5c5SAndroid Build Coastguard Worker} 504*8975f5c5SAndroid Build Coastguard Worker 505*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACRG11ToRG8(size_t width, 506*8975f5c5SAndroid Build Coastguard Worker size_t height, 507*8975f5c5SAndroid Build Coastguard Worker size_t depth, 508*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 509*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 510*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 511*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 512*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 513*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 514*8975f5c5SAndroid Build Coastguard Worker{ 515*8975f5c5SAndroid Build Coastguard Worker LoadEACRG11ToRG8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 516*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 517*8975f5c5SAndroid Build Coastguard Worker} 518*8975f5c5SAndroid Build Coastguard Worker 519*8975f5c5SAndroid Build Coastguard Workerinline void LoadEACRG11SToRG8(size_t width, 520*8975f5c5SAndroid Build Coastguard Worker size_t height, 521*8975f5c5SAndroid Build Coastguard Worker size_t depth, 522*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 523*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 524*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 525*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 526*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 527*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 528*8975f5c5SAndroid Build Coastguard Worker{ 529*8975f5c5SAndroid Build Coastguard Worker LoadEACRG11SToRG8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 530*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 531*8975f5c5SAndroid Build Coastguard Worker} 532*8975f5c5SAndroid Build Coastguard Worker 533*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGB8ToRGBA8(size_t width, 534*8975f5c5SAndroid Build Coastguard Worker size_t height, 535*8975f5c5SAndroid Build Coastguard Worker size_t depth, 536*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 537*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 538*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 539*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 540*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 541*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 542*8975f5c5SAndroid Build Coastguard Worker{ 543*8975f5c5SAndroid Build Coastguard Worker LoadETC2RGB8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 544*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 545*8975f5c5SAndroid Build Coastguard Worker} 546*8975f5c5SAndroid Build Coastguard Worker 547*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGB8ToRGBA8(size_t width, 548*8975f5c5SAndroid Build Coastguard Worker size_t height, 549*8975f5c5SAndroid Build Coastguard Worker size_t depth, 550*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 551*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 552*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 553*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 554*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 555*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 556*8975f5c5SAndroid Build Coastguard Worker{ 557*8975f5c5SAndroid Build Coastguard Worker LoadETC2SRGB8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 558*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 559*8975f5c5SAndroid Build Coastguard Worker} 560*8975f5c5SAndroid Build Coastguard Worker 561*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGBA8ToRGBA8(size_t width, 562*8975f5c5SAndroid Build Coastguard Worker size_t height, 563*8975f5c5SAndroid Build Coastguard Worker size_t depth, 564*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 565*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 566*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 567*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 568*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 569*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 570*8975f5c5SAndroid Build Coastguard Worker{ 571*8975f5c5SAndroid Build Coastguard Worker LoadETC2RGBA8ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 572*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 573*8975f5c5SAndroid Build Coastguard Worker} 574*8975f5c5SAndroid Build Coastguard Worker 575*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2RGB8A1ToRGBA8(size_t width, 576*8975f5c5SAndroid Build Coastguard Worker size_t height, 577*8975f5c5SAndroid Build Coastguard Worker size_t depth, 578*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 579*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 580*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 581*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 582*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 583*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 584*8975f5c5SAndroid Build Coastguard Worker{ 585*8975f5c5SAndroid Build Coastguard Worker LoadETC2RGB8A1ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 586*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 587*8975f5c5SAndroid Build Coastguard Worker} 588*8975f5c5SAndroid Build Coastguard Worker 589*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGBA8ToSRGBA8(size_t width, 590*8975f5c5SAndroid Build Coastguard Worker size_t height, 591*8975f5c5SAndroid Build Coastguard Worker size_t depth, 592*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 593*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 594*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 595*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 596*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 597*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 598*8975f5c5SAndroid Build Coastguard Worker{ 599*8975f5c5SAndroid Build Coastguard Worker LoadETC2SRGBA8ToSRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 600*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 601*8975f5c5SAndroid Build Coastguard Worker} 602*8975f5c5SAndroid Build Coastguard Worker 603*8975f5c5SAndroid Build Coastguard Workerinline void LoadETC2SRGB8A1ToRGBA8(size_t width, 604*8975f5c5SAndroid Build Coastguard Worker size_t height, 605*8975f5c5SAndroid Build Coastguard Worker size_t depth, 606*8975f5c5SAndroid Build Coastguard Worker const uint8_t *input, 607*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch, 608*8975f5c5SAndroid Build Coastguard Worker size_t inputDepthPitch, 609*8975f5c5SAndroid Build Coastguard Worker uint8_t *output, 610*8975f5c5SAndroid Build Coastguard Worker size_t outputRowPitch, 611*8975f5c5SAndroid Build Coastguard Worker size_t outputDepthPitch) 612*8975f5c5SAndroid Build Coastguard Worker{ 613*8975f5c5SAndroid Build Coastguard Worker LoadETC2SRGB8A1ToRGBA8({}, width, height, depth, input, inputRowPitch, inputDepthPitch, output, 614*8975f5c5SAndroid Build Coastguard Worker outputRowPitch, outputDepthPitch); 615*8975f5c5SAndroid Build Coastguard Worker} 616*8975f5c5SAndroid Build Coastguard Worker 617*8975f5c5SAndroid Build Coastguard Worker} // namespace angle 618