[core] add state tracking to pixel store packing alignment

This commit is contained in:
Konstantin Käfer
2016-11-04 17:01:22 +01:00
parent 176730bff6
commit 008a83b915
6 changed files with 67 additions and 12 deletions

View File

@@ -283,6 +283,8 @@ void Context::setDirtyState() {
pointSize.setDirty();
pixelZoom.setDirty();
rasterPos.setDirty();
pixelStorePack.setDirty();
pixelStoreUnpack.setDirty();
#endif // MBGL_USE_GLES2
for (auto& tex : texture) {
tex.setDirty();

View File

@@ -130,6 +130,8 @@ public:
#if not MBGL_USE_GLES2
State<value::PixelZoom> pixelZoom;
State<value::RasterPos> rasterPos;
State<value::PixelStorePack> pixelStorePack;
State<value::PixelStoreUnpack> pixelStoreUnpack;
#endif // MBGL_USE_GLES2
private:

View File

@@ -62,5 +62,17 @@ enum class PrimitiveType {
TriangleFan = 0x0006
};
#if not MBGL_USE_GLES2
struct PixelStorageType {
int32_t alignment;
};
constexpr bool operator!=(const PixelStorageType& a, const PixelStorageType& b) {
return a.alignment != b.alignment;
}
#endif // MBGL_USE_GLES2
} // namespace gl
} // namespace mbgl

View File

@@ -389,8 +389,35 @@ RasterPos::Type RasterPos::Get() {
return { pos[0], pos[1], pos[2], pos[3] };
}
#endif // MBGL_USE_GLES2
const constexpr PixelStorePack::Type PixelStorePack::Default;
void PixelStorePack::Set(const Type& value) {
assert(value.alignment == 1 || value.alignment == 2 || value.alignment == 4 ||
value.alignment == 8);
MBGL_CHECK_ERROR(glPixelStorei(GL_PACK_ALIGNMENT, value.alignment));
}
PixelStorePack::Type PixelStorePack::Get() {
Type value;
MBGL_CHECK_ERROR(glGetIntegerv(GL_PACK_ALIGNMENT, &value.alignment));
return value;
}
const constexpr PixelStoreUnpack::Type PixelStoreUnpack::Default;
void PixelStoreUnpack::Set(const Type& value) {
assert(value.alignment == 1 || value.alignment == 2 || value.alignment == 4 ||
value.alignment == 8);
MBGL_CHECK_ERROR(glPixelStorei(GL_UNPACK_ALIGNMENT, value.alignment));
}
PixelStoreUnpack::Type PixelStoreUnpack::Get() {
Type value;
MBGL_CHECK_ERROR(glGetIntegerv(GL_UNPACK_ALIGNMENT, &value.alignment));
return value;
}
#endif // MBGL_USE_GLES2
} // namespace value
} // namespace gl

View File

@@ -259,7 +259,7 @@ struct RasterPos {
double z;
double w;
};
static const constexpr Type Default = { 0, 0, 0, 0 };
static const constexpr Type Default = { 0, 0, 0, 1 };
static void Set(const Type&);
static Type Get();
};
@@ -268,6 +268,20 @@ constexpr bool operator!=(const RasterPos::Type& a, const RasterPos::Type& b) {
return a.x != b.x || a.y != b.y || a.z != b.z || a.w != b.w;
}
struct PixelStorePack {
using Type = PixelStorageType;
static const constexpr Type Default = { 4 };
static void Set(const Type&);
static Type Get();
};
struct PixelStoreUnpack {
using Type = PixelStorageType;
static const constexpr Type Default = { 4 };
static void Set(const Type&);
static Type Get();
};
#endif // MBGL_USE_GLES2
} // namespace value

View File

@@ -68,12 +68,10 @@ void Painter::renderClipMasks(PaintParameters&) {
context.program = 0;
#if not MBGL_USE_GLES2
context.pixelZoom = { 1, 1 };
context.rasterPos = { -1, -1, 0, 0 };
// When reading data from the framebuffer, make sure that we are storing the depth values
// tightly packed into the buffer to avoid buffer overruns. Also see unpacking adjustment below.
MBGL_CHECK_ERROR(glPixelStorei(GL_PACK_ALIGNMENT, 1));
context.pixelStorePack = { 1 };
// Read the stencil buffer
const auto viewport = context.viewport.getCurrentValue();
@@ -96,8 +94,9 @@ void Painter::renderClipMasks(PaintParameters&) {
*it *= factor;
}
MBGL_CHECK_ERROR(glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
MBGL_CHECK_ERROR(glWindowPos2i(viewport.x, viewport.y));
context.pixelZoom = { 1, 1 };
context.rasterPos = { -1, -1, 0, 1 };
context.pixelStoreUnpack = { 1 };
MBGL_CHECK_ERROR(glDrawPixels(viewport.size.width, viewport.size.height, GL_LUMINANCE,
GL_UNSIGNED_BYTE, pixels.get()));
#endif // MBGL_USE_GLES2
@@ -110,12 +109,10 @@ void Painter::renderDepthBuffer(PaintParameters&) {
context.program = 0;
#if not MBGL_USE_GLES2
context.pixelZoom = { 1, 1 };
context.rasterPos = { -1, -1, 0, 0 };
// When reading data from the framebuffer, make sure that we are storing the depth values
// tightly packed into the buffer to avoid buffer overruns. Also see unpacking adjustment below.
MBGL_CHECK_ERROR(glPixelStorei(GL_PACK_ALIGNMENT, 1));
context.pixelStorePack = { 1 };
// Scales the values in the depth buffer so that they cover the entire grayscale range. This
// makes it easier to spot tiny differences.
@@ -137,8 +134,9 @@ void Painter::renderDepthBuffer(PaintParameters&) {
pixels.get() // GLvoid * data
));
MBGL_CHECK_ERROR(glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
MBGL_CHECK_ERROR(glWindowPos2i(viewport.x, viewport.y));
context.pixelZoom = { 1, 1 };
context.rasterPos = { -1, -1, 0, 1 };
context.pixelStoreUnpack = { 1 };
MBGL_CHECK_ERROR(glDrawPixels(viewport.size.width, viewport.size.height, GL_LUMINANCE,
GL_UNSIGNED_BYTE, pixels.get()));
#endif // MBGL_USE_GLES2