Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  *
  6.  * Permission is hereby granted, free of charge, to any person obtaining a
  7.  * copy of this software and associated documentation files (the "Software"),
  8.  * to deal in the Software without restriction, including without limitation
  9.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10.  * and/or sell copies of the Software, and to permit persons to whom the
  11.  * Software is furnished to do so, subject to the following conditions:
  12.  *
  13.  * The above copyright notice and this permission notice shall be included
  14.  * in all copies or substantial portions of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  19.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  20.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  21.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  22.  * OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25.  
  26. #include <stdbool.h>
  27. #include "glheader.h"
  28. #include "context.h"
  29. #include "get.h"
  30. #include "enums.h"
  31. #include "extensions.h"
  32. #include "mtypes.h"
  33.  
  34.  
  35. /**
  36.  * Return the string for a glGetString(GL_SHADING_LANGUAGE_VERSION) query.
  37.  */
  38. static const GLubyte *
  39. shading_language_version(struct gl_context *ctx)
  40. {
  41.    switch (ctx->API) {
  42.    case API_OPENGL_COMPAT:
  43.    case API_OPENGL_CORE:
  44.       switch (ctx->Const.GLSLVersion) {
  45.       case 120:
  46.          return (const GLubyte *) "1.20";
  47.       case 130:
  48.          return (const GLubyte *) "1.30";
  49.       case 140:
  50.          return (const GLubyte *) "1.40";
  51.       case 150:
  52.          return (const GLubyte *) "1.50";
  53.       case 330:
  54.          return (const GLubyte *) "3.30";
  55.       case 400:
  56.          return (const GLubyte *) "4.00";
  57.       case 410:
  58.          return (const GLubyte *) "4.10";
  59.       case 420:
  60.          return (const GLubyte *) "4.20";
  61.       case 430:
  62.          return (const GLubyte *) "4.30";
  63.       case 440:
  64.          return (const GLubyte *) "4.40";
  65.       case 450:
  66.          return (const GLubyte *) "4.50";
  67.       default:
  68.          _mesa_problem(ctx,
  69.                        "Invalid GLSL version in shading_language_version()");
  70.          return (const GLubyte *) 0;
  71.       }
  72.       break;
  73.  
  74.    case API_OPENGLES2:
  75.       return (ctx->Version < 30)
  76.          ? (const GLubyte *) "OpenGL ES GLSL ES 1.0.16"
  77.          : (const GLubyte *) "OpenGL ES GLSL ES 3.00";
  78.  
  79.    case API_OPENGLES:
  80.       /* fall-through */
  81.  
  82.    default:
  83.       _mesa_problem(ctx, "Unexpected API value in shading_language_version()");
  84.       return (const GLubyte *) 0;
  85.    }
  86. }
  87.  
  88.  
  89. /**
  90.  * Query string-valued state.  The return value should _not_ be freed by
  91.  * the caller.
  92.  *
  93.  * \param name  the state variable to query.
  94.  *
  95.  * \sa glGetString().
  96.  *
  97.  * Tries to get the string from dd_function_table::GetString, otherwise returns
  98.  * the hardcoded strings.
  99.  */
  100. const GLubyte * GLAPIENTRY
  101. _mesa_GetString( GLenum name )
  102. {
  103.    GET_CURRENT_CONTEXT(ctx);
  104.    static const char *vendor = "Brian Paul";
  105.    static const char *renderer = "Mesa";
  106.  
  107.    if (!ctx)
  108.       return NULL;
  109.  
  110.    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
  111.  
  112.    /* this is a required driver function */
  113.    assert(ctx->Driver.GetString);
  114.    {
  115.       /* Give the driver the chance to handle this query */
  116.       const GLubyte *str = (*ctx->Driver.GetString)(ctx, name);
  117.       if (str)
  118.          return str;
  119.    }
  120.  
  121.    switch (name) {
  122.       case GL_VENDOR:
  123.          return (const GLubyte *) vendor;
  124.       case GL_RENDERER:
  125.          return (const GLubyte *) renderer;
  126.       case GL_VERSION:
  127.          return (const GLubyte *) ctx->VersionString;
  128.       case GL_EXTENSIONS:
  129.          if (ctx->API == API_OPENGL_CORE) {
  130.             _mesa_error(ctx, GL_INVALID_ENUM, "glGetString(GL_EXTENSIONS)");
  131.             return (const GLubyte *) 0;
  132.          }
  133.          return (const GLubyte *) ctx->Extensions.String;
  134.       case GL_SHADING_LANGUAGE_VERSION:
  135.          if (ctx->API == API_OPENGLES)
  136.             break;
  137.          return shading_language_version(ctx);
  138.       case GL_PROGRAM_ERROR_STRING_ARB:
  139.          if (ctx->API == API_OPENGL_COMPAT &&
  140.              (ctx->Extensions.ARB_fragment_program ||
  141.               ctx->Extensions.ARB_vertex_program)) {
  142.             return (const GLubyte *) ctx->Program.ErrorString;
  143.          }
  144.          break;
  145.       default:
  146.          break;
  147.    }
  148.  
  149.    _mesa_error( ctx, GL_INVALID_ENUM, "glGetString" );
  150.    return (const GLubyte *) 0;
  151. }
  152.  
  153.  
  154. /**
  155.  * GL3
  156.  */
  157. const GLubyte * GLAPIENTRY
  158. _mesa_GetStringi(GLenum name, GLuint index)
  159. {
  160.    GET_CURRENT_CONTEXT(ctx);
  161.  
  162.    if (!ctx)
  163.       return NULL;
  164.  
  165.    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, NULL);
  166.  
  167.    switch (name) {
  168.    case GL_EXTENSIONS:
  169.       if (index >= _mesa_get_extension_count(ctx)) {
  170.          _mesa_error(ctx, GL_INVALID_VALUE, "glGetStringi(index=%u)", index);
  171.          return (const GLubyte *) 0;
  172.       }
  173.       return _mesa_get_enabled_extension(ctx, index);
  174.    default:
  175.       _mesa_error(ctx, GL_INVALID_ENUM, "glGetStringi");
  176.       return (const GLubyte *) 0;
  177.    }
  178. }
  179.  
  180.  
  181.  
  182. /**
  183.  * Return pointer-valued state, such as a vertex array pointer.
  184.  *
  185.  * \param pname  names state to be queried
  186.  * \param params  returns the pointer value
  187.  *
  188.  * \sa glGetPointerv().
  189.  *
  190.  * Tries to get the specified pointer via dd_function_table::GetPointerv,
  191.  * otherwise gets the specified pointer from the current context.
  192.  */
  193. void GLAPIENTRY
  194. _mesa_GetPointerv( GLenum pname, GLvoid **params )
  195. {
  196.    GET_CURRENT_CONTEXT(ctx);
  197.    const GLuint clientUnit = ctx->Array.ActiveTexture;
  198.  
  199.    if (!params)
  200.       return;
  201.  
  202.    if (MESA_VERBOSE & VERBOSE_API)
  203.       _mesa_debug(ctx, "glGetPointerv %s\n", _mesa_lookup_enum_by_nr(pname));
  204.  
  205.    switch (pname) {
  206.       case GL_VERTEX_ARRAY_POINTER:
  207.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  208.             goto invalid_pname;
  209.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POS].Ptr;
  210.          break;
  211.       case GL_NORMAL_ARRAY_POINTER:
  212.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  213.             goto invalid_pname;
  214.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_NORMAL].Ptr;
  215.          break;
  216.       case GL_COLOR_ARRAY_POINTER:
  217.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  218.             goto invalid_pname;
  219.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR0].Ptr;
  220.          break;
  221.       case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT:
  222.          if (ctx->API != API_OPENGL_COMPAT)
  223.             goto invalid_pname;
  224.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR1].Ptr;
  225.          break;
  226.       case GL_FOG_COORDINATE_ARRAY_POINTER_EXT:
  227.          if (ctx->API != API_OPENGL_COMPAT)
  228.             goto invalid_pname;
  229.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_FOG].Ptr;
  230.          break;
  231.       case GL_INDEX_ARRAY_POINTER:
  232.          if (ctx->API != API_OPENGL_COMPAT)
  233.             goto invalid_pname;
  234.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Ptr;
  235.          break;
  236.       case GL_TEXTURE_COORD_ARRAY_POINTER:
  237.          if (ctx->API != API_OPENGL_COMPAT && ctx->API != API_OPENGLES)
  238.             goto invalid_pname;
  239.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_TEX(clientUnit)].Ptr;
  240.          break;
  241.       case GL_EDGE_FLAG_ARRAY_POINTER:
  242.          if (ctx->API != API_OPENGL_COMPAT)
  243.             goto invalid_pname;
  244.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Ptr;
  245.          break;
  246.       case GL_FEEDBACK_BUFFER_POINTER:
  247.          if (ctx->API != API_OPENGL_COMPAT)
  248.             goto invalid_pname;
  249.          *params = ctx->Feedback.Buffer;
  250.          break;
  251.       case GL_SELECTION_BUFFER_POINTER:
  252.          if (ctx->API != API_OPENGL_COMPAT)
  253.             goto invalid_pname;
  254.          *params = ctx->Select.Buffer;
  255.          break;
  256.       case GL_POINT_SIZE_ARRAY_POINTER_OES:
  257.          if (ctx->API != API_OPENGLES)
  258.             goto invalid_pname;
  259.          *params = (GLvoid *) ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_POINT_SIZE].Ptr;
  260.          break;
  261.       case GL_DEBUG_CALLBACK_FUNCTION_ARB:
  262.       case GL_DEBUG_CALLBACK_USER_PARAM_ARB:
  263.          if (!_mesa_is_desktop_gl(ctx))
  264.             goto invalid_pname;
  265.          else
  266.             *params = _mesa_get_debug_state_ptr(ctx, pname);
  267.          break;
  268.       default:
  269.          goto invalid_pname;
  270.    }
  271.  
  272.    return;
  273.  
  274. invalid_pname:
  275.    _mesa_error( ctx, GL_INVALID_ENUM, "glGetPointerv" );
  276.    return;
  277. }
  278.  
  279.  
  280. /**
  281.  * Returns the current GL error code, or GL_NO_ERROR.
  282.  * \return current error code
  283.  *
  284.  * Returns __struct gl_contextRec::ErrorValue.
  285.  */
  286. GLenum GLAPIENTRY
  287. _mesa_GetError( void )
  288. {
  289.    GET_CURRENT_CONTEXT(ctx);
  290.    GLenum e = ctx->ErrorValue;
  291.    ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, 0);
  292.  
  293.    if (MESA_VERBOSE & VERBOSE_API)
  294.       _mesa_debug(ctx, "glGetError <-- %s\n", _mesa_lookup_enum_by_nr(e));
  295.  
  296.    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
  297.    ctx->ErrorDebugCount = 0;
  298.    return e;
  299. }
  300.  
  301. /**
  302.  * Returns an error code specified by GL_ARB_robustness, or GL_NO_ERROR.
  303.  * \return current context status
  304.  */
  305. GLenum GLAPIENTRY
  306. _mesa_GetGraphicsResetStatusARB( void )
  307. {
  308.    GET_CURRENT_CONTEXT(ctx);
  309.    GLenum status = GL_NO_ERROR;
  310.  
  311.    /* The ARB_robustness specification says:
  312.     *
  313.     *     "If the reset notification behavior is NO_RESET_NOTIFICATION_ARB,
  314.     *     then the implementation will never deliver notification of reset
  315.     *     events, and GetGraphicsResetStatusARB will always return NO_ERROR."
  316.     */
  317.    if (ctx->Const.ResetStrategy == GL_NO_RESET_NOTIFICATION_ARB) {
  318.       if (MESA_VERBOSE & VERBOSE_API)
  319.          _mesa_debug(ctx,
  320.                      "glGetGraphicsResetStatusARB always returns GL_NO_ERROR "
  321.                      "because reset notifictation was not requested at context "
  322.                      "creation.\n");
  323.  
  324.       return GL_NO_ERROR;
  325.    }
  326.  
  327.    if (ctx->Driver.GetGraphicsResetStatus) {
  328.       /* Query the reset status of this context from the driver core.
  329.        */
  330.       status = ctx->Driver.GetGraphicsResetStatus(ctx);
  331.  
  332.       mtx_lock(&ctx->Shared->Mutex);
  333.  
  334.       /* If this context has not been affected by a GPU reset, check to see if
  335.        * some other context in the share group has been affected by a reset.
  336.        * If another context saw a reset but this context did not, assume that
  337.        * this context was not guilty.
  338.        */
  339.       if (status != GL_NO_ERROR) {
  340.          ctx->Shared->ShareGroupReset = true;
  341.       } else if (ctx->Shared->ShareGroupReset && !ctx->ShareGroupReset) {
  342.          status = GL_INNOCENT_CONTEXT_RESET_ARB;
  343.       }
  344.  
  345.       ctx->ShareGroupReset = ctx->Shared->ShareGroupReset;
  346.       mtx_unlock(&ctx->Shared->Mutex);
  347.    }
  348.  
  349.    if (!ctx->Driver.GetGraphicsResetStatus && (MESA_VERBOSE & VERBOSE_API))
  350.       _mesa_debug(ctx,
  351.                   "glGetGraphicsResetStatusARB always returns GL_NO_ERROR "
  352.                   "because the driver doesn't track reset status.\n");
  353.  
  354.    return status;
  355. }
  356.