1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137

gpu / command_buffer / client / vertex_array_object_manager.h [blame]

// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
#define GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_

#include <GLES2/gl2.h>
#include <stdint.h>

#include <memory>
#include <unordered_map>

#include "base/memory/raw_ptr.h"
#include "gles2_impl_export.h"

namespace gpu {
namespace gles2 {

class GLES2Implementation;
class GLES2CmdHelper;
class VertexArrayObject;

// VertexArrayObjectManager manages vertex array objects on the client side
// of the command buffer.
class GLES2_IMPL_EXPORT VertexArrayObjectManager {
 public:
  VertexArrayObjectManager(
      GLuint max_vertex_attribs,
      GLuint array_buffer_id,
      GLuint element_array_buffer_id,
      bool support_client_side_arrays);

  VertexArrayObjectManager(const VertexArrayObjectManager&) = delete;
  VertexArrayObjectManager& operator=(const VertexArrayObjectManager&) = delete;

  ~VertexArrayObjectManager();

  bool IsReservedId(GLuint id) const;

  // Binds an element array.
  // Returns true if service should be called.
  bool BindElementArray(GLuint id);

  // Unbind buffer.
  void UnbindBuffer(GLuint id);

  // Geneates array objects for the given ids.
  void GenVertexArrays(GLsizei n, const GLuint* arrays);

  // Deletes array objects for the given ids.
  void DeleteVertexArrays(GLsizei n, const GLuint* arrays);

  // Binds a vertex array.
  // changed will be set to true if the service should be called.
  // Returns false if array is an unknown id.
  bool BindVertexArray(GLuint array, bool* changed);

  // Whether client side buffers are supported.
  bool SupportsClientSideBuffers();

  // simulated will be set to true if buffers were simulated.
  // Returns true service should be called.
  bool SetupSimulatedClientSideBuffers(
      const char* function_name,
      GLES2Implementation* gl,
      GLES2CmdHelper* gl_helper,
      GLsizei num_elements,
      GLsizei primcount,
      bool* simulated);

  // Returns true if buffers were setup.
  bool SetupSimulatedIndexAndClientSideBuffers(
      const char* function_name,
      GLES2Implementation* gl,
      GLES2CmdHelper* gl_helper,
      GLsizei count,
      GLenum type,
      GLsizei primcount,
      const void* indices,
      GLuint* offset,
      bool* simulated);

  bool HaveEnabledClientSideBuffers() const;

  void SetAttribEnable(GLuint index, bool enabled);

  bool GetVertexAttrib(GLuint index, GLenum pname, uint32_t* param);

  bool GetAttribPointer(GLuint index, GLenum pname, void** ptr) const;

  // Returns false if error.
  bool SetAttribPointer(
      GLuint buffer_id,
      GLuint index,
      GLint size,
      GLenum type,
      GLboolean normalized,
      GLsizei stride,
      const void* ptr,
      GLboolean integer);

  void SetAttribDivisor(GLuint index, GLuint divisor);

  GLuint bound_element_array_buffer() const;

 private:
  typedef std::unordered_map<GLuint, std::unique_ptr<VertexArrayObject>>
      VertexArrayObjectMap;

  bool IsDefaultVAOBound() const;

  GLsizei CollectData(const void* data,
                      GLsizei bytes_per_element,
                      GLsizei real_stride,
                      GLsizei num_elements);

  GLuint max_vertex_attribs_;
  GLuint array_buffer_id_;
  GLsizei array_buffer_size_;
  GLsizei array_buffer_offset_;
  GLuint element_array_buffer_id_;
  GLsizei element_array_buffer_size_;
  GLsizei collection_buffer_size_;
  std::unique_ptr<int8_t[]> collection_buffer_;

  VertexArrayObjectMap vertex_array_objects_;
  std::unique_ptr<VertexArrayObject> default_vertex_array_object_;
  raw_ptr<VertexArrayObject> bound_vertex_array_object_;

  const bool support_client_side_arrays_;
};

}  // namespace gles2
}  // namespace gpu

#endif  // GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_