diff options
Diffstat (limited to 'mesalib/src/mesa')
-rw-r--r-- | mesalib/src/mesa/main/shaderapi.c | 14 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_atom_texture.c | 14 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_drawpixels.c | 28 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_texture.c | 30 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_format.c | 35 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_format.h | 3 |
6 files changed, 83 insertions, 41 deletions
diff --git a/mesalib/src/mesa/main/shaderapi.c b/mesalib/src/mesa/main/shaderapi.c index 2590abe7e..be6946798 100644 --- a/mesalib/src/mesa/main/shaderapi.c +++ b/mesalib/src/mesa/main/shaderapi.c @@ -207,6 +207,8 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader) struct gl_shader *sh; GLuint i, n; + const bool same_type_disallowed = _mesa_is_gles(ctx); + shProg = _mesa_lookup_shader_program_err(ctx, program, "glAttachShader"); if (!shProg) return; @@ -227,6 +229,18 @@ attach_shader(struct gl_context *ctx, GLuint program, GLuint shader) */ _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader"); return; + } else if (same_type_disallowed && + shProg->Shaders[i]->Type == sh->Type) { + /* Shader with the same type is already attached to this program, + * OpenGL ES 2.0 and 3.0 specs say: + * + * "Multiple shader objects of the same type may not be attached + * to a single program object. [...] The error INVALID_OPERATION + * is generated if [...] another shader object of the same type + * as shader is already attached to program." + */ + _mesa_error(ctx, GL_INVALID_OPERATION, "glAttachShader"); + return; } } diff --git a/mesalib/src/mesa/state_tracker/st_atom_texture.c b/mesalib/src/mesa/state_tracker/st_atom_texture.c index 28327bc14..fc2d69013 100644 --- a/mesalib/src/mesa/state_tracker/st_atom_texture.c +++ b/mesalib/src/mesa/state_tracker/st_atom_texture.c @@ -234,11 +234,17 @@ update_single_texture(struct st_context *st, } /* Determine the format of the texture sampler view */ - view_format = stObj->pt->format; + if (texObj->Target == GL_TEXTURE_BUFFER) { + view_format = + st_mesa_format_to_pipe_format(stObj->base._BufferObjectFormat); + } + else { + view_format = stObj->pt->format; - /* If sRGB decoding is off, use the linear format */ - if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) { - view_format = util_format_linear(view_format); + /* If sRGB decoding is off, use the linear format */ + if (samp->sRGBDecode == GL_SKIP_DECODE_EXT) { + view_format = util_format_linear(view_format); + } } /* if sampler view has changed dereference it */ diff --git a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c index ba4f17a3d..e282bf98d 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c @@ -484,19 +484,29 @@ make_texture(struct st_context *st, gl_format mformat; struct pipe_resource *pt; enum pipe_format pipeFormat; - GLenum baseInternalFormat, intFormat; - - intFormat = internal_format(ctx, format, type); - baseInternalFormat = _mesa_base_tex_format(ctx, intFormat); + GLenum baseInternalFormat; /* Choose a pixel format for the temp texture which will hold the * image to draw. */ - pipeFormat = st_choose_format(st, intFormat, format, type, - PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW, - FALSE); - assert(pipeFormat != PIPE_FORMAT_NONE); - mformat = st_pipe_format_to_mesa_format(pipeFormat); + pipeFormat = st_choose_matching_format(pipe->screen, PIPE_BIND_SAMPLER_VIEW, + format, type, unpack->SwapBytes); + + if (pipeFormat != PIPE_FORMAT_NONE) { + mformat = st_pipe_format_to_mesa_format(pipeFormat); + baseInternalFormat = _mesa_get_format_base_format(mformat); + } + else { + /* Use the generic approach. */ + GLenum intFormat = internal_format(ctx, format, type); + + baseInternalFormat = _mesa_base_tex_format(ctx, intFormat); + pipeFormat = st_choose_format(st, intFormat, format, type, + PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW, + FALSE); + assert(pipeFormat != PIPE_FORMAT_NONE); + mformat = st_pipe_format_to_mesa_format(pipeFormat); + } pixels = _mesa_map_pbo_source(ctx, unpack, pixels); if (!pixels) diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c index ac70e9292..f8ff024db 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_texture.c +++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c @@ -560,32 +560,6 @@ st_CompressedTexImage(struct gl_context *ctx, GLuint dims, } -static enum pipe_format -choose_matching_format(struct pipe_screen *screen, unsigned bind, - GLenum format, GLenum type, GLboolean swapBytes) -{ - gl_format mesa_format; - - for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) { - if (_mesa_get_format_color_encoding(mesa_format) == GL_SRGB) { - continue; - } - - if (_mesa_format_matches_format_and_type(mesa_format, format, type, - swapBytes)) { - enum pipe_format format = st_mesa_format_to_pipe_format(mesa_format); - - if (format && - screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, - bind)) { - return format; - } - /* It's unlikely to find 2 matching Mesa formats. */ - break; - } - } - return PIPE_FORMAT_NONE; -} /** @@ -683,8 +657,8 @@ st_GetTexImage(struct gl_context * ctx, /* Choose the destination format by finding the best match * for the format+type combo. */ - dst_format = choose_matching_format(screen, bind, format, type, - ctx->Pack.SwapBytes); + dst_format = st_choose_matching_format(screen, bind, format, type, + ctx->Pack.SwapBytes); if (dst_format == PIPE_FORMAT_NONE) { GLenum dst_glformat; diff --git a/mesalib/src/mesa/state_tracker/st_format.c b/mesalib/src/mesa/state_tracker/st_format.c index 02969b995..5fd44e76d 100644 --- a/mesalib/src/mesa/state_tracker/st_format.c +++ b/mesalib/src/mesa/state_tracker/st_format.c @@ -1675,6 +1675,41 @@ st_choose_renderbuffer_format(struct st_context *st, /** + * Given an OpenGL user-requested format and type, and swapBytes state, + * return the format which exactly matches those parameters, so that + * a memcpy-based transfer can be done. + * + * If no format is supported, return PIPE_FORMAT_NONE. + */ +enum pipe_format +st_choose_matching_format(struct pipe_screen *screen, unsigned bind, + GLenum format, GLenum type, GLboolean swapBytes) +{ + gl_format mesa_format; + + for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) { + if (_mesa_get_format_color_encoding(mesa_format) == GL_SRGB) { + continue; + } + + if (_mesa_format_matches_format_and_type(mesa_format, format, type, + swapBytes)) { + enum pipe_format format = st_mesa_format_to_pipe_format(mesa_format); + + if (format && + screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0, + bind)) { + return format; + } + /* It's unlikely to find 2 matching Mesa formats. */ + break; + } + } + return PIPE_FORMAT_NONE; +} + + +/** * Called via ctx->Driver.ChooseTextureFormat(). */ gl_format diff --git a/mesalib/src/mesa/state_tracker/st_format.h b/mesalib/src/mesa/state_tracker/st_format.h index aee624d24..3db409b74 100644 --- a/mesalib/src/mesa/state_tracker/st_format.h +++ b/mesalib/src/mesa/state_tracker/st_format.h @@ -57,6 +57,9 @@ extern enum pipe_format st_choose_renderbuffer_format(struct st_context *st, GLenum internalFormat, unsigned sample_count); +extern enum pipe_format +st_choose_matching_format(struct pipe_screen *screen, unsigned bind, + GLenum format, GLenum type, GLboolean swapBytes); extern gl_format st_ChooseTextureFormat(struct gl_context * ctx, GLenum target, |