diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2016-11-04 17:01:22 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-11-04 21:24:05 +0100 |
commit | 008a83b91584b8cf406264c5378bdd7ef87683ec (patch) | |
tree | 661e94fe3eb7bcb39a0e93acefce6e30e3d6b3f5 | |
parent | 176730bff64fc8f935e3337f870b2ff2a930ed15 (diff) | |
download | qtlocation-mapboxgl-008a83b91584b8cf406264c5378bdd7ef87683ec.tar.gz |
[core] add state tracking to pixel store packing alignment
-rw-r--r-- | src/mbgl/gl/context.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/gl/context.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/gl/types.hpp | 12 | ||||
-rw-r--r-- | src/mbgl/gl/value.cpp | 29 | ||||
-rw-r--r-- | src/mbgl/gl/value.hpp | 16 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_debug.cpp | 18 |
6 files changed, 67 insertions, 12 deletions
diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index fc35028473..ceb9796ba6 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -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(); diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index e0f9b871cc..b3edd55636 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -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: diff --git a/src/mbgl/gl/types.hpp b/src/mbgl/gl/types.hpp index 16a37d58c1..6e1bc5f8e1 100644 --- a/src/mbgl/gl/types.hpp +++ b/src/mbgl/gl/types.hpp @@ -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 diff --git a/src/mbgl/gl/value.cpp b/src/mbgl/gl/value.cpp index f25008854d..af4f03a132 100644 --- a/src/mbgl/gl/value.cpp +++ b/src/mbgl/gl/value.cpp @@ -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 diff --git a/src/mbgl/gl/value.hpp b/src/mbgl/gl/value.hpp index 1f01d4e71a..613bbfcab2 100644 --- a/src/mbgl/gl/value.hpp +++ b/src/mbgl/gl/value.hpp @@ -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 diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp index a502c3eddf..1db2167b71 100644 --- a/src/mbgl/renderer/painter_debug.cpp +++ b/src/mbgl/renderer/painter_debug.cpp @@ -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 |