diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/state_tracker/st_cb_fbo.c | 12 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_format.c | 49 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_format.h | 5 |
3 files changed, 57 insertions, 9 deletions
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 3e4aeab523..e1cc7d98bd 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -70,14 +70,6 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb, if (!info) return GL_FALSE; - switch (pipeFormat) { - case PIPE_FORMAT_S8_Z24: - strb->Base.DataType = GL_UNSIGNED_INT; - break; - default: - strb->Base.DataType = GL_UNSIGNED_BYTE; /* XXX fix */ - } - strb->Base._ActualFormat = info->base_format; strb->Base.RedBits = info->red_bits; strb->Base.GreenBits = info->green_bits; @@ -85,6 +77,9 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb, strb->Base.AlphaBits = info->alpha_bits; strb->Base.DepthBits = info->depth_bits; strb->Base.StencilBits = info->stencil_bits; + strb->Base.DataType = st_format_datatype(pipeFormat); + + assert(strb->Base.DataType); cpp = info->size; @@ -229,6 +224,7 @@ st_new_renderbuffer_fb(GLenum intFormat) switch (intFormat) { case GL_RGB5: case GL_RGBA8: + case GL_RGBA16: strb->Base._BaseFormat = GL_RGBA; break; case GL_DEPTH_COMPONENT16: diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c index 2d20892cb0..7564c6014e 100644 --- a/src/mesa/state_tracker/st_format.c +++ b/src/mesa/state_tracker/st_format.c @@ -54,6 +54,7 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_U_R8_G8_B8_A8, /* format */ GL_RGBA, /* base_format */ + GL_UNSIGNED_BYTE, /* datatype for renderbuffers */ 8, 8, 8, 8, 0, 0, /* color bits */ 0, 0, /* depth, stencil */ 4 /* size in bytes */ @@ -61,6 +62,7 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_U_A8_R8_G8_B8, GL_RGBA, /* base_format */ + GL_UNSIGNED_BYTE, /* datatype for renderbuffers */ 8, 8, 8, 8, 0, 0, /* color bits */ 0, 0, /* depth, stencil */ 4 /* size in bytes */ @@ -68,6 +70,7 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_U_A1_R5_G5_B5, GL_RGBA, /* base_format */ + GL_UNSIGNED_SHORT, /* datatype for renderbuffers */ 5, 5, 5, 1, 0, 0, /* color bits */ 0, 0, /* depth, stencil */ 2 /* size in bytes */ @@ -75,13 +78,23 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_U_R5_G6_B5, GL_RGBA, /* base_format */ + GL_UNSIGNED_SHORT, /* datatype for renderbuffers */ 5, 6, 5, 0, 0, 0, /* color bits */ 0, 0, /* depth, stencil */ 2 /* size in bytes */ }, { + PIPE_FORMAT_S_R16_G16_B16_A16, + GL_RGBA, /* base_format */ + GL_UNSIGNED_SHORT, /* datatype for renderbuffers */ + 16, 16, 16, 16, 0, 0, /* color bits */ + 0, 0, /* depth, stencil */ + 8 /* size in bytes */ + }, + { PIPE_FORMAT_U_Z16, GL_DEPTH_COMPONENT, /* base_format */ + GL_UNSIGNED_SHORT, /* datatype for renderbuffers */ 0, 0, 0, 0, 0, 0, /* color bits */ 16, 0, /* depth, stencil */ 2 /* size in bytes */ @@ -89,6 +102,7 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_U_Z32, GL_DEPTH_COMPONENT, /* base_format */ + GL_UNSIGNED_INT, /* datatype for renderbuffers */ 0, 0, 0, 0, 0, 0, /* color bits */ 32, 0, /* depth, stencil */ 4 /* size in bytes */ @@ -96,6 +110,7 @@ st_get_format_info(GLuint format) { PIPE_FORMAT_S8_Z24, GL_DEPTH_STENCIL_EXT, /* base_format */ + GL_UNSIGNED_INT, /* datatype for renderbuffers */ 0, 0, 0, 0, 0, 0, /* color bits */ 24, 8, /* depth, stencil */ 4 /* size in bytes */ @@ -112,6 +127,9 @@ st_get_format_info(GLuint format) } +/** + * Return bytes per pixel for the given format. + */ GLuint st_sizeof_format(GLuint pipeFormat) { @@ -121,6 +139,18 @@ st_sizeof_format(GLuint pipeFormat) } +/** + * Return bytes per pixel for the given format. + */ +GLenum +st_format_datatype(GLuint pipeFormat) +{ + const struct pipe_format_info *info = st_get_format_info(pipeFormat); + assert(info); + return info->datatype; +} + + GLuint st_mesa_format_to_pipe_format(GLuint mesaFormat) { @@ -165,6 +195,22 @@ default_rgba_format(const GLuint formats[], GLuint num) /** + * Search list of formats for first RGBA format with >8 bits/channel. + */ +static GLuint +default_deep_rgba_format(const GLuint formats[], GLuint num) +{ + GLuint i; + for (i = 0; i < num; i++) { + if (formats[i] == PIPE_FORMAT_S_R16_G16_B16_A16) { + return formats[i]; + } + } + return PIPE_FORMAT_NONE; +} + + +/** * Search list of formats for first depth/Z format. */ static GLuint @@ -244,8 +290,9 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat, case GL_RGBA8: case GL_RGB10_A2: case GL_RGBA12: - case GL_RGBA16: return default_rgba_format(supported, n); + case GL_RGBA16: + return default_deep_rgba_format(supported, n); case GL_RGBA4: case GL_RGBA2: diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h index 6b3cba0f63..17d0985411 100644 --- a/src/mesa/state_tracker/st_format.h +++ b/src/mesa/state_tracker/st_format.h @@ -34,6 +34,7 @@ struct pipe_format_info { GLuint format; GLenum base_format; + GLenum datatype; GLubyte red_bits; GLubyte green_bits; GLubyte blue_bits; @@ -54,6 +55,10 @@ extern GLuint st_sizeof_format(GLuint pipeFormat); +extern GLenum +st_format_datatype(GLuint pipeFormat); + + extern GLuint st_mesa_format_to_pipe_format(GLuint mesaFormat); |