Path: blob/main_old/src/image_util/loadimage.cpp
1693 views
//1// Copyright 2013 The ANGLE Project Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file.4//56// angle_loadimage.cpp: Defines image loading functions.78#include "image_util/loadimage.h"910#include "common/mathutil.h"11#include "common/platform.h"12#include "image_util/imageformats.h"1314namespace angle15{1617void LoadA8ToRGBA8(size_t width,18size_t height,19size_t depth,20const uint8_t *input,21size_t inputRowPitch,22size_t inputDepthPitch,23uint8_t *output,24size_t outputRowPitch,25size_t outputDepthPitch)26{27#if defined(ANGLE_USE_SSE)28if (gl::supportsSSE2())29{30__m128i zeroWide = _mm_setzero_si128();3132for (size_t z = 0; z < depth; z++)33{34for (size_t y = 0; y < height; y++)35{36const uint8_t *source =37priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);38uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,39outputDepthPitch);4041size_t x = 0;4243// Make output writes aligned44for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 0xF) != 0 && x < width); x++)45{46dest[x] = static_cast<uint32_t>(source[x]) << 24;47}4849for (; x + 7 < width; x += 8)50{51__m128i sourceData =52_mm_loadl_epi64(reinterpret_cast<const __m128i *>(&source[x]));53// Interleave each byte to 16bit, make the lower byte to zero54sourceData = _mm_unpacklo_epi8(zeroWide, sourceData);55// Interleave each 16bit to 32bit, make the lower 16bit to zero56__m128i lo = _mm_unpacklo_epi16(zeroWide, sourceData);57__m128i hi = _mm_unpackhi_epi16(zeroWide, sourceData);5859_mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), lo);60_mm_store_si128(reinterpret_cast<__m128i *>(&dest[x + 4]), hi);61}6263// Handle the remainder64for (; x < width; x++)65{66dest[x] = static_cast<uint32_t>(source[x]) << 24;67}68}69}7071return;72}73#endif7475for (size_t z = 0; z < depth; z++)76{77for (size_t y = 0; y < height; y++)78{79const uint8_t *source =80priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);81uint32_t *dest =82priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);83for (size_t x = 0; x < width; x++)84{85dest[x] = static_cast<uint32_t>(source[x]) << 24;86}87}88}89}9091void LoadA8ToBGRA8(size_t width,92size_t height,93size_t depth,94const uint8_t *input,95size_t inputRowPitch,96size_t inputDepthPitch,97uint8_t *output,98size_t outputRowPitch,99size_t outputDepthPitch)100{101// Same as loading to RGBA102LoadA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,103outputRowPitch, outputDepthPitch);104}105106void LoadA32FToRGBA32F(size_t width,107size_t height,108size_t depth,109const uint8_t *input,110size_t inputRowPitch,111size_t inputDepthPitch,112uint8_t *output,113size_t outputRowPitch,114size_t outputDepthPitch)115{116for (size_t z = 0; z < depth; z++)117{118for (size_t y = 0; y < height; y++)119{120const float *source =121priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);122float *dest =123priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);124for (size_t x = 0; x < width; x++)125{126dest[4 * x + 0] = 0.0f;127dest[4 * x + 1] = 0.0f;128dest[4 * x + 2] = 0.0f;129dest[4 * x + 3] = source[x];130}131}132}133}134135void LoadA16FToRGBA16F(size_t width,136size_t height,137size_t depth,138const uint8_t *input,139size_t inputRowPitch,140size_t inputDepthPitch,141uint8_t *output,142size_t outputRowPitch,143size_t outputDepthPitch)144{145for (size_t z = 0; z < depth; z++)146{147for (size_t y = 0; y < height; y++)148{149const uint16_t *source =150priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);151uint16_t *dest =152priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);153for (size_t x = 0; x < width; x++)154{155dest[4 * x + 0] = 0;156dest[4 * x + 1] = 0;157dest[4 * x + 2] = 0;158dest[4 * x + 3] = source[x];159}160}161}162}163164void LoadL8ToRGBA8(size_t width,165size_t height,166size_t depth,167const uint8_t *input,168size_t inputRowPitch,169size_t inputDepthPitch,170uint8_t *output,171size_t outputRowPitch,172size_t outputDepthPitch)173{174for (size_t z = 0; z < depth; z++)175{176for (size_t y = 0; y < height; y++)177{178const uint8_t *source =179priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);180uint8_t *dest =181priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);182for (size_t x = 0; x < width; x++)183{184uint8_t sourceVal = source[x];185dest[4 * x + 0] = sourceVal;186dest[4 * x + 1] = sourceVal;187dest[4 * x + 2] = sourceVal;188dest[4 * x + 3] = 0xFF;189}190}191}192}193194void LoadL8ToBGRA8(size_t width,195size_t height,196size_t depth,197const uint8_t *input,198size_t inputRowPitch,199size_t inputDepthPitch,200uint8_t *output,201size_t outputRowPitch,202size_t outputDepthPitch)203{204// Same as loading to RGBA205LoadL8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,206outputRowPitch, outputDepthPitch);207}208209void LoadL32FToRGBA32F(size_t width,210size_t height,211size_t depth,212const uint8_t *input,213size_t inputRowPitch,214size_t inputDepthPitch,215uint8_t *output,216size_t outputRowPitch,217size_t outputDepthPitch)218{219for (size_t z = 0; z < depth; z++)220{221for (size_t y = 0; y < height; y++)222{223const float *source =224priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);225float *dest =226priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);227for (size_t x = 0; x < width; x++)228{229dest[4 * x + 0] = source[x];230dest[4 * x + 1] = source[x];231dest[4 * x + 2] = source[x];232dest[4 * x + 3] = 1.0f;233}234}235}236}237238void LoadL16FToRGBA16F(size_t width,239size_t height,240size_t depth,241const uint8_t *input,242size_t inputRowPitch,243size_t inputDepthPitch,244uint8_t *output,245size_t outputRowPitch,246size_t outputDepthPitch)247{248for (size_t z = 0; z < depth; z++)249{250for (size_t y = 0; y < height; y++)251{252const uint16_t *source =253priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);254uint16_t *dest =255priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);256for (size_t x = 0; x < width; x++)257{258dest[4 * x + 0] = source[x];259dest[4 * x + 1] = source[x];260dest[4 * x + 2] = source[x];261dest[4 * x + 3] = gl::Float16One;262}263}264}265}266267void LoadLA8ToRGBA8(size_t width,268size_t height,269size_t depth,270const uint8_t *input,271size_t inputRowPitch,272size_t inputDepthPitch,273uint8_t *output,274size_t outputRowPitch,275size_t outputDepthPitch)276{277for (size_t z = 0; z < depth; z++)278{279for (size_t y = 0; y < height; y++)280{281const uint8_t *source =282priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);283uint8_t *dest =284priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);285for (size_t x = 0; x < width; x++)286{287dest[4 * x + 0] = source[2 * x + 0];288dest[4 * x + 1] = source[2 * x + 0];289dest[4 * x + 2] = source[2 * x + 0];290dest[4 * x + 3] = source[2 * x + 1];291}292}293}294}295296void LoadLA8ToBGRA8(size_t width,297size_t height,298size_t depth,299const uint8_t *input,300size_t inputRowPitch,301size_t inputDepthPitch,302uint8_t *output,303size_t outputRowPitch,304size_t outputDepthPitch)305{306// Same as loading to RGBA307LoadLA8ToRGBA8(width, height, depth, input, inputRowPitch, inputDepthPitch, output,308outputRowPitch, outputDepthPitch);309}310311void LoadLA32FToRGBA32F(size_t width,312size_t height,313size_t depth,314const uint8_t *input,315size_t inputRowPitch,316size_t inputDepthPitch,317uint8_t *output,318size_t outputRowPitch,319size_t outputDepthPitch)320{321for (size_t z = 0; z < depth; z++)322{323for (size_t y = 0; y < height; y++)324{325const float *source =326priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);327float *dest =328priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);329for (size_t x = 0; x < width; x++)330{331dest[4 * x + 0] = source[2 * x + 0];332dest[4 * x + 1] = source[2 * x + 0];333dest[4 * x + 2] = source[2 * x + 0];334dest[4 * x + 3] = source[2 * x + 1];335}336}337}338}339340void LoadLA16FToRGBA16F(size_t width,341size_t height,342size_t depth,343const uint8_t *input,344size_t inputRowPitch,345size_t inputDepthPitch,346uint8_t *output,347size_t outputRowPitch,348size_t outputDepthPitch)349{350for (size_t z = 0; z < depth; z++)351{352for (size_t y = 0; y < height; y++)353{354const uint16_t *source =355priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);356uint16_t *dest =357priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);358for (size_t x = 0; x < width; x++)359{360dest[4 * x + 0] = source[2 * x + 0];361dest[4 * x + 1] = source[2 * x + 0];362dest[4 * x + 2] = source[2 * x + 0];363dest[4 * x + 3] = source[2 * x + 1];364}365}366}367}368369void LoadRGB8ToBGR565(size_t width,370size_t height,371size_t depth,372const uint8_t *input,373size_t inputRowPitch,374size_t inputDepthPitch,375uint8_t *output,376size_t outputRowPitch,377size_t outputDepthPitch)378{379for (size_t z = 0; z < depth; z++)380{381for (size_t y = 0; y < height; y++)382{383const uint8_t *source =384priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);385uint16_t *dest =386priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);387for (size_t x = 0; x < width; x++)388{389uint8_t r8 = source[x * 3 + 0];390uint8_t g8 = source[x * 3 + 1];391uint8_t b8 = source[x * 3 + 2];392auto r5 = static_cast<uint16_t>(r8 >> 3);393auto g6 = static_cast<uint16_t>(g8 >> 2);394auto b5 = static_cast<uint16_t>(b8 >> 3);395dest[x] = (r5 << 11) | (g6 << 5) | b5;396}397}398}399}400401void LoadRGB565ToBGR565(size_t width,402size_t height,403size_t depth,404const uint8_t *input,405size_t inputRowPitch,406size_t inputDepthPitch,407uint8_t *output,408size_t outputRowPitch,409size_t outputDepthPitch)410{411for (size_t z = 0; z < depth; z++)412{413for (size_t y = 0; y < height; y++)414{415const uint16_t *source =416priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);417uint16_t *dest =418priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);419for (size_t x = 0; x < width; x++)420{421// The GL type RGB is packed with with red in the MSB, while the D3D11 type BGR422// is packed with red in the LSB423auto rgb = source[x];424uint16_t r5 = gl::getShiftedData<5, 11>(rgb);425uint16_t g6 = gl::getShiftedData<6, 5>(rgb);426uint16_t b5 = gl::getShiftedData<5, 0>(rgb);427dest[x] = (r5 << 11) | (g6 << 5) | b5;428}429}430}431}432433void LoadRGB8ToBGRX8(size_t width,434size_t height,435size_t depth,436const uint8_t *input,437size_t inputRowPitch,438size_t inputDepthPitch,439uint8_t *output,440size_t outputRowPitch,441size_t outputDepthPitch)442{443for (size_t z = 0; z < depth; z++)444{445for (size_t y = 0; y < height; y++)446{447const uint8_t *source =448priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);449uint8_t *dest =450priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);451for (size_t x = 0; x < width; x++)452{453dest[4 * x + 0] = source[x * 3 + 2];454dest[4 * x + 1] = source[x * 3 + 1];455dest[4 * x + 2] = source[x * 3 + 0];456dest[4 * x + 3] = 0xFF;457}458}459}460}461462void LoadRG8ToBGRX8(size_t width,463size_t height,464size_t depth,465const uint8_t *input,466size_t inputRowPitch,467size_t inputDepthPitch,468uint8_t *output,469size_t outputRowPitch,470size_t outputDepthPitch)471{472for (size_t z = 0; z < depth; z++)473{474for (size_t y = 0; y < height; y++)475{476const uint8_t *source =477priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);478uint8_t *dest =479priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);480for (size_t x = 0; x < width; x++)481{482dest[4 * x + 0] = 0x00;483dest[4 * x + 1] = source[x * 2 + 1];484dest[4 * x + 2] = source[x * 2 + 0];485dest[4 * x + 3] = 0xFF;486}487}488}489}490491void LoadR8ToBGRX8(size_t width,492size_t height,493size_t depth,494const uint8_t *input,495size_t inputRowPitch,496size_t inputDepthPitch,497uint8_t *output,498size_t outputRowPitch,499size_t outputDepthPitch)500{501for (size_t z = 0; z < depth; z++)502{503for (size_t y = 0; y < height; y++)504{505const uint8_t *source =506priv::OffsetDataPointer<uint8_t>(input, y, z, inputRowPitch, inputDepthPitch);507uint8_t *dest =508priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);509for (size_t x = 0; x < width; x++)510{511dest[4 * x + 0] = 0x00;512dest[4 * x + 1] = 0x00;513dest[4 * x + 2] = source[x];514dest[4 * x + 3] = 0xFF;515}516}517}518}519520void LoadR5G6B5ToBGRA8(size_t width,521size_t height,522size_t depth,523const uint8_t *input,524size_t inputRowPitch,525size_t inputDepthPitch,526uint8_t *output,527size_t outputRowPitch,528size_t outputDepthPitch)529{530for (size_t z = 0; z < depth; z++)531{532for (size_t y = 0; y < height; y++)533{534const uint16_t *source =535priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);536uint8_t *dest =537priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);538for (size_t x = 0; x < width; x++)539{540uint16_t rgb = source[x];541dest[4 * x + 0] =542static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));543dest[4 * x + 1] =544static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));545dest[4 * x + 2] =546static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));547dest[4 * x + 3] = 0xFF;548}549}550}551}552553void LoadR5G6B5ToRGBA8(size_t width,554size_t height,555size_t depth,556const uint8_t *input,557size_t inputRowPitch,558size_t inputDepthPitch,559uint8_t *output,560size_t outputRowPitch,561size_t outputDepthPitch)562{563for (size_t z = 0; z < depth; z++)564{565for (size_t y = 0; y < height; y++)566{567const uint16_t *source =568priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);569uint8_t *dest =570priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);571for (size_t x = 0; x < width; x++)572{573uint16_t rgb = source[x];574dest[4 * x + 0] =575static_cast<uint8_t>(((rgb & 0xF800) >> 8) | ((rgb & 0xF800) >> 13));576dest[4 * x + 1] =577static_cast<uint8_t>(((rgb & 0x07E0) >> 3) | ((rgb & 0x07E0) >> 9));578dest[4 * x + 2] =579static_cast<uint8_t>(((rgb & 0x001F) << 3) | ((rgb & 0x001F) >> 2));580dest[4 * x + 3] = 0xFF;581}582}583}584}585586void LoadRGBA8ToBGRA8(size_t width,587size_t height,588size_t depth,589const uint8_t *input,590size_t inputRowPitch,591size_t inputDepthPitch,592uint8_t *output,593size_t outputRowPitch,594size_t outputDepthPitch)595{596#if defined(ANGLE_USE_SSE)597if (gl::supportsSSE2())598{599__m128i brMask = _mm_set1_epi32(0x00ff00ff);600601for (size_t z = 0; z < depth; z++)602{603for (size_t y = 0; y < height; y++)604{605const uint32_t *source =606priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);607uint32_t *dest = priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch,608outputDepthPitch);609610size_t x = 0;611612// Make output writes aligned613for (; ((reinterpret_cast<intptr_t>(&dest[x]) & 15) != 0) && x < width; x++)614{615uint32_t rgba = source[x];616dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);617}618619for (; x + 3 < width; x += 4)620{621__m128i sourceData =622_mm_loadu_si128(reinterpret_cast<const __m128i *>(&source[x]));623// Mask out g and a, which don't change624__m128i gaComponents = _mm_andnot_si128(brMask, sourceData);625// Mask out b and r626__m128i brComponents = _mm_and_si128(sourceData, brMask);627// Swap b and r628__m128i brSwapped = _mm_shufflehi_epi16(629_mm_shufflelo_epi16(brComponents, _MM_SHUFFLE(2, 3, 0, 1)),630_MM_SHUFFLE(2, 3, 0, 1));631__m128i result = _mm_or_si128(gaComponents, brSwapped);632_mm_store_si128(reinterpret_cast<__m128i *>(&dest[x]), result);633}634635// Perform leftover writes636for (; x < width; x++)637{638uint32_t rgba = source[x];639dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);640}641}642}643644return;645}646#endif647648for (size_t z = 0; z < depth; z++)649{650for (size_t y = 0; y < height; y++)651{652const uint32_t *source =653priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);654uint32_t *dest =655priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);656for (size_t x = 0; x < width; x++)657{658uint32_t rgba = source[x];659dest[x] = (ANGLE_ROTL(rgba, 16) & 0x00ff00ff) | (rgba & 0xff00ff00);660}661}662}663}664665void LoadRGBA8ToBGRA4(size_t width,666size_t height,667size_t depth,668const uint8_t *input,669size_t inputRowPitch,670size_t inputDepthPitch,671uint8_t *output,672size_t outputRowPitch,673size_t outputDepthPitch)674{675for (size_t z = 0; z < depth; z++)676{677for (size_t y = 0; y < height; y++)678{679const uint32_t *source =680priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);681uint16_t *dest =682priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);683for (size_t x = 0; x < width; x++)684{685uint32_t rgba8 = source[x];686auto r4 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);687auto g4 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);688auto b4 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);689auto a4 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);690dest[x] = (a4 << 12) | (r4 << 8) | (g4 << 4) | b4;691}692}693}694}695696void LoadRGBA8ToRGBA4(size_t width,697size_t height,698size_t depth,699const uint8_t *input,700size_t inputRowPitch,701size_t inputDepthPitch,702uint8_t *output,703size_t outputRowPitch,704size_t outputDepthPitch)705{706for (size_t z = 0; z < depth; z++)707{708for (size_t y = 0; y < height; y++)709{710const uint32_t *source =711priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);712uint16_t *dest =713priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);714for (size_t x = 0; x < width; x++)715{716uint32_t rgba8 = source[x];717auto r4 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 4);718auto g4 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 12);719auto b4 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 20);720auto a4 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 28);721dest[x] = (r4 << 12) | (g4 << 8) | (b4 << 4) | a4;722}723}724}725}726727void LoadRGBA4ToARGB4(size_t width,728size_t height,729size_t depth,730const uint8_t *input,731size_t inputRowPitch,732size_t inputDepthPitch,733uint8_t *output,734size_t outputRowPitch,735size_t outputDepthPitch)736{737for (size_t z = 0; z < depth; z++)738{739for (size_t y = 0; y < height; y++)740{741const uint16_t *source =742priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);743uint16_t *dest =744priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);745for (size_t x = 0; x < width; x++)746{747dest[x] = ANGLE_ROTR16(source[x], 4);748}749}750}751}752753void LoadRGBA4ToBGRA8(size_t width,754size_t height,755size_t depth,756const uint8_t *input,757size_t inputRowPitch,758size_t inputDepthPitch,759uint8_t *output,760size_t outputRowPitch,761size_t outputDepthPitch)762{763for (size_t z = 0; z < depth; z++)764{765for (size_t y = 0; y < height; y++)766{767const uint16_t *source =768priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);769uint8_t *dest =770priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);771for (size_t x = 0; x < width; x++)772{773uint16_t rgba = source[x];774dest[4 * x + 0] =775static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));776dest[4 * x + 1] =777static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));778dest[4 * x + 2] =779static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));780dest[4 * x + 3] =781static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));782}783}784}785}786787void LoadRGBA4ToRGBA8(size_t width,788size_t height,789size_t depth,790const uint8_t *input,791size_t inputRowPitch,792size_t inputDepthPitch,793uint8_t *output,794size_t outputRowPitch,795size_t outputDepthPitch)796{797for (size_t z = 0; z < depth; z++)798{799for (size_t y = 0; y < height; y++)800{801const uint16_t *source =802priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);803uint8_t *dest =804priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);805for (size_t x = 0; x < width; x++)806{807uint16_t rgba = source[x];808dest[4 * x + 0] =809static_cast<uint8_t>(((rgba & 0xF000) >> 8) | ((rgba & 0xF000) >> 12));810dest[4 * x + 1] =811static_cast<uint8_t>(((rgba & 0x0F00) >> 4) | ((rgba & 0x0F00) >> 8));812dest[4 * x + 2] =813static_cast<uint8_t>(((rgba & 0x00F0) << 0) | ((rgba & 0x00F0) >> 4));814dest[4 * x + 3] =815static_cast<uint8_t>(((rgba & 0x000F) << 4) | ((rgba & 0x000F) >> 0));816}817}818}819}820821void LoadBGRA4ToBGRA8(size_t width,822size_t height,823size_t depth,824const uint8_t *input,825size_t inputRowPitch,826size_t inputDepthPitch,827uint8_t *output,828size_t outputRowPitch,829size_t outputDepthPitch)830{831for (size_t z = 0; z < depth; z++)832{833for (size_t y = 0; y < height; y++)834{835const uint16_t *source =836priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);837uint8_t *dest =838priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);839for (size_t x = 0; x < width; x++)840{841uint16_t bgra = source[x];842dest[4 * x + 0] =843static_cast<uint8_t>(((bgra & 0xF000) >> 8) | ((bgra & 0xF000) >> 12));844dest[4 * x + 1] =845static_cast<uint8_t>(((bgra & 0x0F00) >> 4) | ((bgra & 0x0F00) >> 8));846dest[4 * x + 2] =847static_cast<uint8_t>(((bgra & 0x00F0) << 0) | ((bgra & 0x00F0) >> 4));848dest[4 * x + 3] =849static_cast<uint8_t>(((bgra & 0x000F) << 4) | ((bgra & 0x000F) >> 0));850}851}852}853}854855void LoadRGBA8ToBGR5A1(size_t width,856size_t height,857size_t depth,858const uint8_t *input,859size_t inputRowPitch,860size_t inputDepthPitch,861uint8_t *output,862size_t outputRowPitch,863size_t outputDepthPitch)864{865for (size_t z = 0; z < depth; z++)866{867for (size_t y = 0; y < height; y++)868{869const uint32_t *source =870priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);871uint16_t *dest =872priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);873for (size_t x = 0; x < width; x++)874{875uint32_t rgba8 = source[x];876auto r5 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);877auto g5 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);878auto b5 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);879auto a1 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);880dest[x] = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;881}882}883}884}885886void LoadRGBA8ToRGB5A1(size_t width,887size_t height,888size_t depth,889const uint8_t *input,890size_t inputRowPitch,891size_t inputDepthPitch,892uint8_t *output,893size_t outputRowPitch,894size_t outputDepthPitch)895{896for (size_t z = 0; z < depth; z++)897{898for (size_t y = 0; y < height; y++)899{900const uint32_t *source =901priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);902uint16_t *dest =903priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);904for (size_t x = 0; x < width; x++)905{906uint32_t rgba8 = source[x];907auto r5 = static_cast<uint16_t>((rgba8 & 0x000000FF) >> 3);908auto g5 = static_cast<uint16_t>((rgba8 & 0x0000FF00) >> 11);909auto b5 = static_cast<uint16_t>((rgba8 & 0x00FF0000) >> 19);910auto a1 = static_cast<uint16_t>((rgba8 & 0xFF000000) >> 31);911dest[x] = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;912}913}914}915}916917void LoadRGB10A2ToBGR5A1(size_t width,918size_t height,919size_t depth,920const uint8_t *input,921size_t inputRowPitch,922size_t inputDepthPitch,923uint8_t *output,924size_t outputRowPitch,925size_t outputDepthPitch)926{927for (size_t z = 0; z < depth; z++)928{929for (size_t y = 0; y < height; y++)930{931const R10G10B10A2 *source =932priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);933uint16_t *dest =934priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);935for (size_t x = 0; x < width; x++)936{937R10G10B10A2 rgb10a2 = source[x];938939uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);940uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);941uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);942uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);943944dest[x] = (a1 << 15) | (r5 << 10) | (g5 << 5) | b5;945}946}947}948}949950void LoadRGB10A2ToRGB5A1(size_t width,951size_t height,952size_t depth,953const uint8_t *input,954size_t inputRowPitch,955size_t inputDepthPitch,956uint8_t *output,957size_t outputRowPitch,958size_t outputDepthPitch)959{960for (size_t z = 0; z < depth; z++)961{962for (size_t y = 0; y < height; y++)963{964const R10G10B10A2 *source =965priv::OffsetDataPointer<R10G10B10A2>(input, y, z, inputRowPitch, inputDepthPitch);966uint16_t *dest =967priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);968for (size_t x = 0; x < width; x++)969{970R10G10B10A2 rgb10a2 = source[x];971972uint16_t r5 = static_cast<uint16_t>(rgb10a2.R >> 5u);973uint16_t g5 = static_cast<uint16_t>(rgb10a2.G >> 5u);974uint16_t b5 = static_cast<uint16_t>(rgb10a2.B >> 5u);975uint16_t a1 = static_cast<uint16_t>(rgb10a2.A >> 1u);976977dest[x] = (r5 << 11) | (g5 << 6) | (b5 << 1) | a1;978}979}980}981}982983void LoadRGB5A1ToA1RGB5(size_t width,984size_t height,985size_t depth,986const uint8_t *input,987size_t inputRowPitch,988size_t inputDepthPitch,989uint8_t *output,990size_t outputRowPitch,991size_t outputDepthPitch)992{993for (size_t z = 0; z < depth; z++)994{995for (size_t y = 0; y < height; y++)996{997const uint16_t *source =998priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);999uint16_t *dest =1000priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);1001for (size_t x = 0; x < width; x++)1002{1003dest[x] = ANGLE_ROTR16(source[x], 1);1004}1005}1006}1007}10081009void LoadRGB5A1ToBGR5A1(size_t width,1010size_t height,1011size_t depth,1012const uint8_t *input,1013size_t inputRowPitch,1014size_t inputDepthPitch,1015uint8_t *output,1016size_t outputRowPitch,1017size_t outputDepthPitch)1018{1019for (size_t z = 0; z < depth; z++)1020{1021for (size_t y = 0; y < height; y++)1022{1023const uint16_t *source =1024priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1025uint16_t *dest =1026priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);1027for (size_t x = 0; x < width; x++)1028{1029uint16_t rgba = source[x];1030auto r5 = static_cast<uint16_t>((rgba & 0xF800) >> 11);1031auto g5 = static_cast<uint16_t>((rgba & 0x07c0) >> 6);1032auto b5 = static_cast<uint16_t>((rgba & 0x003e) >> 1);1033auto a1 = static_cast<uint16_t>((rgba & 0x0001));1034dest[x] = (b5 << 11) | (g5 << 6) | (r5 << 1) | a1;1035}1036}1037}1038}10391040void LoadRGB5A1ToBGRA8(size_t width,1041size_t height,1042size_t depth,1043const uint8_t *input,1044size_t inputRowPitch,1045size_t inputDepthPitch,1046uint8_t *output,1047size_t outputRowPitch,1048size_t outputDepthPitch)1049{1050for (size_t z = 0; z < depth; z++)1051{1052for (size_t y = 0; y < height; y++)1053{1054const uint16_t *source =1055priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1056uint8_t *dest =1057priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);1058for (size_t x = 0; x < width; x++)1059{1060uint16_t rgba = source[x];1061dest[4 * x + 0] =1062static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));1063dest[4 * x + 1] =1064static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));1065dest[4 * x + 2] =1066static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));1067dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);1068}1069}1070}1071}10721073void LoadRGB5A1ToRGBA8(size_t width,1074size_t height,1075size_t depth,1076const uint8_t *input,1077size_t inputRowPitch,1078size_t inputDepthPitch,1079uint8_t *output,1080size_t outputRowPitch,1081size_t outputDepthPitch)1082{1083for (size_t z = 0; z < depth; z++)1084{1085for (size_t y = 0; y < height; y++)1086{1087const uint16_t *source =1088priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1089uint8_t *dest =1090priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);1091for (size_t x = 0; x < width; x++)1092{1093uint16_t rgba = source[x];1094dest[4 * x + 0] =1095static_cast<uint8_t>(((rgba & 0xF800) >> 8) | ((rgba & 0xF800) >> 13));1096dest[4 * x + 1] =1097static_cast<uint8_t>(((rgba & 0x07C0) >> 3) | ((rgba & 0x07C0) >> 8));1098dest[4 * x + 2] =1099static_cast<uint8_t>(((rgba & 0x003E) << 2) | ((rgba & 0x003E) >> 3));1100dest[4 * x + 3] = static_cast<uint8_t>((rgba & 0x0001) ? 0xFF : 0);1101}1102}1103}1104}11051106void LoadBGR5A1ToBGRA8(size_t width,1107size_t height,1108size_t depth,1109const uint8_t *input,1110size_t inputRowPitch,1111size_t inputDepthPitch,1112uint8_t *output,1113size_t outputRowPitch,1114size_t outputDepthPitch)1115{1116for (size_t z = 0; z < depth; z++)1117{1118for (size_t y = 0; y < height; y++)1119{1120const uint16_t *source =1121priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1122uint8_t *dest =1123priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);1124for (size_t x = 0; x < width; x++)1125{1126uint16_t bgra = source[x];1127dest[4 * x + 0] =1128static_cast<uint8_t>(((bgra & 0xF800) >> 8) | ((bgra & 0xF800) >> 13));1129dest[4 * x + 1] =1130static_cast<uint8_t>(((bgra & 0x07C0) >> 3) | ((bgra & 0x07C0) >> 8));1131dest[4 * x + 2] =1132static_cast<uint8_t>(((bgra & 0x003E) << 2) | ((bgra & 0x003E) >> 3));1133dest[4 * x + 3] = static_cast<uint8_t>((bgra & 0x0001) ? 0xFF : 0);1134}1135}1136}1137}11381139void LoadRGB10A2ToRGBA8(size_t width,1140size_t height,1141size_t depth,1142const uint8_t *input,1143size_t inputRowPitch,1144size_t inputDepthPitch,1145uint8_t *output,1146size_t outputRowPitch,1147size_t outputDepthPitch)1148{1149for (size_t z = 0; z < depth; z++)1150{1151for (size_t y = 0; y < height; y++)1152{1153const uint32_t *source =1154priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1155uint8_t *dest =1156priv::OffsetDataPointer<uint8_t>(output, y, z, outputRowPitch, outputDepthPitch);1157for (size_t x = 0; x < width; x++)1158{1159uint32_t rgba = source[x];1160dest[4 * x + 0] = static_cast<uint8_t>((rgba & 0x000003FF) >> 2);1161dest[4 * x + 1] = static_cast<uint8_t>((rgba & 0x000FFC00) >> 12);1162dest[4 * x + 2] = static_cast<uint8_t>((rgba & 0x3FF00000) >> 22);1163dest[4 * x + 3] = static_cast<uint8_t>(((rgba & 0xC0000000) >> 30) * 0x55);1164}1165}1166}1167}11681169void LoadRGB10A2ToRGB10X2(size_t width,1170size_t height,1171size_t depth,1172const uint8_t *input,1173size_t inputRowPitch,1174size_t inputDepthPitch,1175uint8_t *output,1176size_t outputRowPitch,1177size_t outputDepthPitch)1178{1179for (size_t z = 0; z < depth; z++)1180{1181for (size_t y = 0; y < height; y++)1182{1183const uint32_t *source =1184priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1185uint32_t *dest =1186priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1187for (size_t x = 0; x < width; x++)1188{1189dest[x] = source[x] | 0xC0000000;1190}1191}1192}1193}11941195void LoadRGB16FToRGB9E5(size_t width,1196size_t height,1197size_t depth,1198const uint8_t *input,1199size_t inputRowPitch,1200size_t inputDepthPitch,1201uint8_t *output,1202size_t outputRowPitch,1203size_t outputDepthPitch)1204{1205for (size_t z = 0; z < depth; z++)1206{1207for (size_t y = 0; y < height; y++)1208{1209const uint16_t *source =1210priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1211uint32_t *dest =1212priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1213for (size_t x = 0; x < width; x++)1214{1215dest[x] = gl::convertRGBFloatsTo999E5(gl::float16ToFloat32(source[x * 3 + 0]),1216gl::float16ToFloat32(source[x * 3 + 1]),1217gl::float16ToFloat32(source[x * 3 + 2]));1218}1219}1220}1221}12221223void LoadRGB32FToRGB9E5(size_t width,1224size_t height,1225size_t depth,1226const uint8_t *input,1227size_t inputRowPitch,1228size_t inputDepthPitch,1229uint8_t *output,1230size_t outputRowPitch,1231size_t outputDepthPitch)1232{1233for (size_t z = 0; z < depth; z++)1234{1235for (size_t y = 0; y < height; y++)1236{1237const float *source =1238priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1239uint32_t *dest =1240priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1241for (size_t x = 0; x < width; x++)1242{1243dest[x] = gl::convertRGBFloatsTo999E5(source[x * 3 + 0], source[x * 3 + 1],1244source[x * 3 + 2]);1245}1246}1247}1248}12491250void LoadRGB16FToRG11B10F(size_t width,1251size_t height,1252size_t depth,1253const uint8_t *input,1254size_t inputRowPitch,1255size_t inputDepthPitch,1256uint8_t *output,1257size_t outputRowPitch,1258size_t outputDepthPitch)1259{1260for (size_t z = 0; z < depth; z++)1261{1262for (size_t y = 0; y < height; y++)1263{1264const uint16_t *source =1265priv::OffsetDataPointer<uint16_t>(input, y, z, inputRowPitch, inputDepthPitch);1266uint32_t *dest =1267priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1268for (size_t x = 0; x < width; x++)1269{1270dest[x] = (gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 0])) << 0) |1271(gl::float32ToFloat11(gl::float16ToFloat32(source[x * 3 + 1])) << 11) |1272(gl::float32ToFloat10(gl::float16ToFloat32(source[x * 3 + 2])) << 22);1273}1274}1275}1276}12771278void LoadRGB32FToRG11B10F(size_t width,1279size_t height,1280size_t depth,1281const uint8_t *input,1282size_t inputRowPitch,1283size_t inputDepthPitch,1284uint8_t *output,1285size_t outputRowPitch,1286size_t outputDepthPitch)1287{1288for (size_t z = 0; z < depth; z++)1289{1290for (size_t y = 0; y < height; y++)1291{1292const float *source =1293priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1294uint32_t *dest =1295priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1296for (size_t x = 0; x < width; x++)1297{1298dest[x] = (gl::float32ToFloat11(source[x * 3 + 0]) << 0) |1299(gl::float32ToFloat11(source[x * 3 + 1]) << 11) |1300(gl::float32ToFloat10(source[x * 3 + 2]) << 22);1301}1302}1303}1304}13051306void LoadG8R24ToR24G8(size_t width,1307size_t height,1308size_t depth,1309const uint8_t *input,1310size_t inputRowPitch,1311size_t inputDepthPitch,1312uint8_t *output,1313size_t outputRowPitch,1314size_t outputDepthPitch)1315{1316for (size_t z = 0; z < depth; z++)1317{1318for (size_t y = 0; y < height; y++)1319{1320const uint32_t *source =1321priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1322uint32_t *dest =1323priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1324for (size_t x = 0; x < width; x++)1325{1326uint32_t d = source[x] >> 8;1327uint8_t s = source[x] & 0xFF;1328dest[x] = d | (s << 24);1329}1330}1331}1332}13331334void LoadD24S8ToD32FS8X24(size_t width,1335size_t height,1336size_t depth,1337const uint8_t *input,1338size_t inputRowPitch,1339size_t inputDepthPitch,1340uint8_t *output,1341size_t outputRowPitch,1342size_t outputDepthPitch)1343{1344for (size_t z = 0; z < depth; z++)1345{1346for (size_t y = 0; y < height; y++)1347{1348const uint32_t *source =1349priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1350float *destDepth =1351priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1352uint32_t *destStencil =1353priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +13541;1355for (size_t x = 0; x < width; x++)1356{1357destDepth[x * 2] = (source[x] & 0xFFFFFF) / static_cast<float>(0xFFFFFF);1358destStencil[x * 2] = source[x] & 0xFF000000;1359}1360}1361}1362}13631364void LoadD24S8ToD32F(size_t width,1365size_t height,1366size_t depth,1367const uint8_t *input,1368size_t inputRowPitch,1369size_t inputDepthPitch,1370uint8_t *output,1371size_t outputRowPitch,1372size_t outputDepthPitch)1373{1374for (size_t z = 0; z < depth; z++)1375{1376for (size_t y = 0; y < height; y++)1377{1378const uint32_t *source =1379priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1380float *destDepth =1381priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1382for (size_t x = 0; x < width; x++)1383{1384uint32_t sourcePixel = (source[x] >> 8) & 0xFFFFFF;1385destDepth[x] = sourcePixel / static_cast<float>(0xFFFFFF);1386}1387}1388}1389}13901391void LoadD32ToD32FX32(size_t width,1392size_t height,1393size_t depth,1394const uint8_t *input,1395size_t inputRowPitch,1396size_t inputDepthPitch,1397uint8_t *output,1398size_t outputRowPitch,1399size_t outputDepthPitch)1400{1401for (size_t z = 0; z < depth; z++)1402{1403for (size_t y = 0; y < height; y++)1404{1405const uint32_t *source =1406priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1407float *destDepth =1408priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1409for (size_t x = 0; x < width; x++)1410{1411destDepth[x * 2] = source[x] / static_cast<float>(0xFFFFFFFF);1412}1413}1414}1415}14161417void LoadD32ToD32F(size_t width,1418size_t height,1419size_t depth,1420const uint8_t *input,1421size_t inputRowPitch,1422size_t inputDepthPitch,1423uint8_t *output,1424size_t outputRowPitch,1425size_t outputDepthPitch)1426{1427for (size_t z = 0; z < depth; z++)1428{1429for (size_t y = 0; y < height; y++)1430{1431const uint32_t *source =1432priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1433float *destDepth =1434priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1435for (size_t x = 0; x < width; x++)1436{1437uint32_t sourcePixel = source[x];1438destDepth[x] = sourcePixel / static_cast<float>(0xFFFFFFFF);1439}1440}1441}1442}14431444void LoadD32FToD32F(size_t width,1445size_t height,1446size_t depth,1447const uint8_t *input,1448size_t inputRowPitch,1449size_t inputDepthPitch,1450uint8_t *output,1451size_t outputRowPitch,1452size_t outputDepthPitch)1453{1454for (size_t z = 0; z < depth; z++)1455{1456for (size_t y = 0; y < height; y++)1457{1458const float *source =1459priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1460float *dest =1461priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1462for (size_t x = 0; x < width; x++)1463{1464dest[x] = gl::clamp01(source[x]);1465}1466}1467}1468}14691470void LoadD32FS8X24ToD24S8(size_t width,1471size_t height,1472size_t depth,1473const uint8_t *input,1474size_t inputRowPitch,1475size_t inputDepthPitch,1476uint8_t *output,1477size_t outputRowPitch,1478size_t outputDepthPitch)1479{1480for (size_t z = 0; z < depth; z++)1481{1482for (size_t y = 0; y < height; y++)1483{1484const float *sourceDepth =1485priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1486const uint32_t *sourceStencil =1487priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;1488uint32_t *dest =1489priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);1490for (size_t x = 0; x < width; x++)1491{1492uint32_t d = static_cast<uint32_t>(gl::clamp01(sourceDepth[x * 2]) * 0xFFFFFF);1493uint32_t s = sourceStencil[x * 2] & 0xFF000000;1494dest[x] = d | s;1495}1496}1497}1498}14991500void LoadX24S8ToS8(size_t width,1501size_t height,1502size_t depth,1503const uint8_t *input,1504size_t inputRowPitch,1505size_t inputDepthPitch,1506uint8_t *output,1507size_t outputRowPitch,1508size_t outputDepthPitch)1509{1510for (size_t z = 0; z < depth; z++)1511{1512for (size_t y = 0; y < height; y++)1513{1514const uint32_t *source = reinterpret_cast<const uint32_t *>(1515input + (y * inputRowPitch) + (z * inputDepthPitch));1516uint8_t *destStencil =1517reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));1518for (size_t x = 0; x < width; x++)1519{1520destStencil[x] = (source[x] & 0xFF);1521}1522}1523}1524}15251526void LoadX32S8ToS8(size_t width,1527size_t height,1528size_t depth,1529const uint8_t *input,1530size_t inputRowPitch,1531size_t inputDepthPitch,1532uint8_t *output,1533size_t outputRowPitch,1534size_t outputDepthPitch)1535{1536for (size_t z = 0; z < depth; z++)1537{1538for (size_t y = 0; y < height; y++)1539{1540const uint32_t *source = reinterpret_cast<const uint32_t *>(1541input + (y * inputRowPitch) + (z * inputDepthPitch));1542uint8_t *destStencil =1543reinterpret_cast<uint8_t *>(output + (y * outputRowPitch) + (z * outputDepthPitch));1544for (size_t x = 0; x < width; x++)1545{1546destStencil[x] = (source[(x * 2) + 1] & 0xFF);1547}1548}1549}1550}15511552void LoadD32FS8X24ToD32F(size_t width,1553size_t height,1554size_t depth,1555const uint8_t *input,1556size_t inputRowPitch,1557size_t inputDepthPitch,1558uint8_t *output,1559size_t outputRowPitch,1560size_t outputDepthPitch)1561{1562for (size_t z = 0; z < depth; z++)1563{1564for (size_t y = 0; y < height; y++)1565{1566const float *sourceDepth =1567priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1568float *destDepth =1569priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1570for (size_t x = 0; x < width; x++)1571{1572destDepth[x] = gl::clamp01(sourceDepth[x * 2]);1573}1574}1575}1576}15771578void LoadD32FS8X24ToD32FS8X24(size_t width,1579size_t height,1580size_t depth,1581const uint8_t *input,1582size_t inputRowPitch,1583size_t inputDepthPitch,1584uint8_t *output,1585size_t outputRowPitch,1586size_t outputDepthPitch)1587{1588for (size_t z = 0; z < depth; z++)1589{1590for (size_t y = 0; y < height; y++)1591{1592const float *sourceDepth =1593priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1594const uint32_t *sourceStencil =1595priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch) + 1;1596float *destDepth =1597priv::OffsetDataPointer<float>(output, y, z, outputRowPitch, outputDepthPitch);1598uint32_t *destStencil =1599priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch) +16001;1601for (size_t x = 0; x < width; x++)1602{1603destDepth[x * 2] = gl::clamp01(sourceDepth[x * 2]);1604destStencil[x * 2] = sourceStencil[x * 2] & 0xFF000000;1605}1606}1607}1608}16091610void LoadRGB32FToRGBA16F(size_t width,1611size_t height,1612size_t depth,1613const uint8_t *input,1614size_t inputRowPitch,1615size_t inputDepthPitch,1616uint8_t *output,1617size_t outputRowPitch,1618size_t outputDepthPitch)1619{1620for (size_t z = 0; z < depth; z++)1621{1622for (size_t y = 0; y < height; y++)1623{1624const float *source =1625priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1626uint16_t *dest =1627priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);1628for (size_t x = 0; x < width; x++)1629{1630dest[x * 4 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);1631dest[x * 4 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);1632dest[x * 4 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);1633dest[x * 4 + 3] = gl::Float16One;1634}1635}1636}1637}16381639void LoadRGB32FToRGB16F(size_t width,1640size_t height,1641size_t depth,1642const uint8_t *input,1643size_t inputRowPitch,1644size_t inputDepthPitch,1645uint8_t *output,1646size_t outputRowPitch,1647size_t outputDepthPitch)1648{1649for (size_t z = 0; z < depth; z++)1650{1651for (size_t y = 0; y < height; y++)1652{1653const float *source =1654priv::OffsetDataPointer<float>(input, y, z, inputRowPitch, inputDepthPitch);1655uint16_t *dest =1656priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);1657for (size_t x = 0; x < width; x++)1658{1659dest[x * 3 + 0] = gl::float32ToFloat16(source[x * 3 + 0]);1660dest[x * 3 + 1] = gl::float32ToFloat16(source[x * 3 + 1]);1661dest[x * 3 + 2] = gl::float32ToFloat16(source[x * 3 + 2]);1662}1663}1664}1665}16661667void LoadR32ToR16(size_t width,1668size_t height,1669size_t depth,1670const uint8_t *input,1671size_t inputRowPitch,1672size_t inputDepthPitch,1673uint8_t *output,1674size_t outputRowPitch,1675size_t outputDepthPitch)1676{1677for (size_t z = 0; z < depth; z++)1678{1679for (size_t y = 0; y < height; y++)1680{1681const uint32_t *source =1682priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1683uint16_t *dest =1684priv::OffsetDataPointer<uint16_t>(output, y, z, outputRowPitch, outputDepthPitch);1685for (size_t x = 0; x < width; x++)1686{1687dest[x] = source[x] >> 16;1688}1689}1690}1691}16921693void LoadR32ToR24G8(size_t width,1694size_t height,1695size_t depth,1696const uint8_t *input,1697size_t inputRowPitch,1698size_t inputDepthPitch,1699uint8_t *output,1700size_t outputRowPitch,1701size_t outputDepthPitch)1702{1703for (size_t z = 0; z < depth; z++)1704{1705for (size_t y = 0; y < height; y++)1706{1707const uint32_t *source =1708priv::OffsetDataPointer<uint32_t>(input, y, z, inputRowPitch, inputDepthPitch);1709uint32_t *dest =1710priv::OffsetDataPointer<uint32_t>(output, y, z, outputRowPitch, outputDepthPitch);17111712for (size_t x = 0; x < width; x++)1713{1714dest[x] = source[x] >> 8;1715}1716}1717}1718}17191720void LoadYuvToNative(size_t width,1721size_t height,1722size_t depth,1723const uint8_t *input,1724size_t inputRowPitch,1725size_t inputDepthPitch,1726uint8_t *output,1727size_t outputRowPitch,1728size_t outputDepthPitch)1729{1730// For YUV formats it is assumed that source has tightly packed data.1731memcpy(output, input, inputDepthPitch);1732}17331734} // namespace angle173517361737