Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2014 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21.  * DEALINGS IN THE SOFTWARE.
  22.  */
  23.  
  24. #include "glheader.h"
  25. #include "compute.h"
  26. #include "context.h"
  27.  
  28. void GLAPIENTRY
  29. _mesa_DispatchCompute(GLuint num_groups_x,
  30.                       GLuint num_groups_y,
  31.                       GLuint num_groups_z)
  32. {
  33.    GET_CURRENT_CONTEXT(ctx);
  34.    int i;
  35.    struct gl_shader_program *prog;
  36.    const GLuint num_groups[3] = { num_groups_x, num_groups_y, num_groups_z };
  37.  
  38.    if (ctx->Extensions.ARB_compute_shader) {
  39.       for (i = 0; i < 3; i++) {
  40.          if (num_groups[i] > ctx->Const.MaxComputeWorkGroupCount[i]) {
  41.             _mesa_error(ctx, GL_INVALID_VALUE,
  42.                         "glDispatchCompute(num_groups_%c)", 'x' + i);
  43.             return;
  44.          }
  45.       }
  46.       if (!_mesa_valid_to_render(ctx, "glDispatchCompute"))
  47.          return;
  48.       prog = ctx->Shader.CurrentProgram[MESA_SHADER_COMPUTE];
  49.       if (prog == NULL || prog->_LinkedShaders[MESA_SHADER_COMPUTE] == NULL) {
  50.          _mesa_error(ctx, GL_INVALID_OPERATION,
  51.                      "glDispatchCompute(no active compute shader)");
  52.          return;
  53.       }
  54.       ctx->Driver.DispatchCompute(ctx, num_groups);
  55.    } else {
  56.       _mesa_error(ctx, GL_INVALID_OPERATION,
  57.                   "unsupported function (glDispatchCompute) called");
  58.    }
  59. }
  60.  
  61. extern void GLAPIENTRY
  62. _mesa_DispatchComputeIndirect(GLintptr indirect)
  63. {
  64.    GET_CURRENT_CONTEXT(ctx);
  65.  
  66.    if (ctx->Extensions.ARB_compute_shader) {
  67.       assert(!"TODO");
  68.    } else {
  69.       _mesa_error(ctx, GL_INVALID_OPERATION,
  70.                   "unsupported function (glDispatchComputeIndirect) called");
  71.    }
  72. }
  73.