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 }