blob: 43f03af24061804a2b4d6acbd183b15e67911095 [file] [log] [blame]
Lingfeng Yang22dc42d2018-05-29 10:11:38 -07001#include "IOStream.h"
2
3#include "GL2Encoder.h"
4
5#include <GLES3/gl31.h>
6
7#include <vector>
8
9void IOStream::readbackPixels(void* context, int width, int height, unsigned int format, unsigned int type, void* pixels) {
10 GL2Encoder *ctx = (GL2Encoder *)context;
11 assert (ctx->state() != NULL);
12
13 int startOffset = 0;
14 int pixelRowSize = 0;
15 int totalRowSize = 0;
16 int skipRows = 0;
17
18 ctx->state()->getPackingOffsets2D(width, height, format, type,
19 &startOffset,
20 &pixelRowSize,
21 &totalRowSize,
22 &skipRows);
23
24 size_t pixelDataSize =
25 ctx->state()->pixelDataSize(
26 width, height, 1, format, type, 1 /* is pack */);
27
28 if (startOffset == 0 &&
29 pixelRowSize == totalRowSize) {
30 // fast path
31 readback(pixels, pixelDataSize);
32 } else if (pixelRowSize == totalRowSize) {
33 // fast path but with skip in the beginning
34 std::vector<char> paddingToDiscard(startOffset, 0);
35 readback(&paddingToDiscard[0], startOffset);
36 readback((char*)pixels + startOffset, pixelDataSize - startOffset);
37 } else {
38 int totalReadback = 0;
39
40 if (startOffset > 0) {
41 std::vector<char> paddingToDiscard(startOffset, 0);
42 readback(&paddingToDiscard[0], startOffset);
43 totalReadback += startOffset;
44 }
45 // need to read back row by row
46 size_t paddingSize = totalRowSize - pixelRowSize;
47 std::vector<char> paddingToDiscard(paddingSize, 0);
48
49 char* start = (char*)pixels + startOffset;
50
51 for (int i = 0; i < height; i++) {
52 readback(start, pixelRowSize);
53 totalReadback += pixelRowSize;
54 readback(&paddingToDiscard[0], paddingSize);
55 totalReadback += paddingSize;
56 start += totalRowSize;
57 }
58 }
59}