diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index 22362d3081f..19fe019f211 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -2619,13 +2619,15 @@
-
+
-
+
diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
index 8dfd2cfca9c..45ad84a1eb8 100644
--- a/src/mesa/main/glthread.c
+++ b/src/mesa/main/glthread.c
@@ -36,6 +36,7 @@
#include "main/glthread.h"
#include "main/glthread_marshal.h"
#include "main/hash.h"
+#include "main/pixelstore.h"
#include "util/u_atomic.h"
#include "util/u_thread.h"
#include "util/u_cpu_detect.h"
@@ -234,6 +235,7 @@ _mesa_glthread_init(struct gl_context *ctx)
}
_mesa_glthread_init_dispatch(ctx, ctx->MarshalExec);
+ _mesa_init_pixelstore_attrib(ctx, &glthread->Unpack);
for (unsigned i = 0; i < MARSHAL_MAX_BATCHES; i++) {
glthread->batches[i].ctx = ctx;
@@ -469,3 +471,56 @@ _mesa_glthread_invalidate_zsbuf(struct gl_context *ctx)
_mesa_marshal_InternalInvalidateFramebufferAncillaryMESA();
return true;
}
+
+void
+_mesa_glthread_PixelStorei(struct gl_context *ctx, GLenum pname, GLint param)
+{
+ switch (pname) {
+ case GL_UNPACK_SWAP_BYTES:
+ ctx->GLThread.Unpack.SwapBytes = !!param;
+ break;
+ case GL_UNPACK_LSB_FIRST:
+ ctx->GLThread.Unpack.LsbFirst = !!param;
+ break;
+ case GL_UNPACK_ROW_LENGTH:
+ if (param >= 0)
+ ctx->GLThread.Unpack.RowLength = param;
+ break;
+ case GL_UNPACK_IMAGE_HEIGHT:
+ if (param >= 0)
+ ctx->GLThread.Unpack.ImageHeight = param;
+ break;
+ case GL_UNPACK_SKIP_PIXELS:
+ if (param >= 0)
+ ctx->GLThread.Unpack.SkipPixels = param;
+ break;
+ case GL_UNPACK_SKIP_ROWS:
+ if (param >= 0)
+ ctx->GLThread.Unpack.SkipRows = param;
+ break;
+ case GL_UNPACK_SKIP_IMAGES:
+ if (param >= 0)
+ ctx->GLThread.Unpack.SkipImages = param;
+ break;
+ case GL_UNPACK_ALIGNMENT:
+ if (param >= 1 && param <= 8 && util_is_power_of_two_nonzero(param))
+ ctx->GLThread.Unpack.Alignment = param;
+ break;
+ case GL_UNPACK_COMPRESSED_BLOCK_WIDTH:
+ if (param >= 0)
+ ctx->GLThread.Unpack.CompressedBlockWidth = param;
+ break;
+ case GL_UNPACK_COMPRESSED_BLOCK_HEIGHT:
+ if (param >= 0)
+ ctx->GLThread.Unpack.CompressedBlockHeight = param;
+ break;
+ case GL_UNPACK_COMPRESSED_BLOCK_DEPTH:
+ if (param >= 0)
+ ctx->GLThread.Unpack.CompressedBlockDepth = param;
+ break;
+ case GL_UNPACK_COMPRESSED_BLOCK_SIZE:
+ if (param >= 0)
+ ctx->GLThread.Unpack.CompressedBlockSize = param;
+ break;
+ }
+}
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index fd23b3f0e7a..39594b368e7 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -301,6 +301,8 @@ struct glthread_state
/** Global mutex update info. */
unsigned GlobalLockUpdateBatchCounter;
bool LockGlobalMutexes;
+
+ struct gl_pixelstore_attrib Unpack;
};
void _mesa_glthread_init(struct gl_context *ctx);
@@ -400,6 +402,8 @@ void _mesa_glthread_UnrollDrawElements(struct gl_context *ctx,
GLenum mode, GLsizei count, GLenum type,
const GLvoid *indices, GLint basevertex);
void _mesa_glthread_unbind_uploaded_vbos(struct gl_context *ctx);
+void _mesa_glthread_PixelStorei(struct gl_context *ctx, GLenum pname,
+ GLint param);
#ifdef __cplusplus
}