/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2014 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_UI_GL_GL4_ELEMENTAL_RENDERER_H_ #define XENIA_UI_GL_GL4_ELEMENTAL_RENDERER_H_ #include #include #include "el/graphics/renderer.h" #include "xenia/ui/gl/circular_buffer.h" #include "xenia/ui/gl/gl_context.h" namespace xe { namespace ui { namespace gl { class GL4ElementalRenderer : public el::graphics::Renderer { public: explicit GL4ElementalRenderer(GLContext* context); ~GL4ElementalRenderer() override; static std::unique_ptr Create(GLContext* context); void BeginPaint(int render_target_w, int render_target_h) override; void EndPaint() override; std::unique_ptr CreateBitmap(int width, int height, uint32_t* data) override; void RenderBatch(Batch* batch) override; void set_clip_rect(const el::Rect& rect) override; private: class GL4Bitmap : public el::graphics::Bitmap { public: GL4Bitmap(GLContext* context, GL4ElementalRenderer* renderer); ~GL4Bitmap(); bool Init(int width, int height, uint32_t* data); int width() override { return width_; } int height() override { return height_; } void set_data(uint32_t* data) override; GLContext* context_ = nullptr; GL4ElementalRenderer* renderer_ = nullptr; int width_ = 0; int height_ = 0; GLuint handle_ = 0; GLuint64 gpu_handle_ = 0; }; static const uint32_t kMaxVertexBatchSize = 6 * 2048; bool Initialize(); void Flush(); size_t max_vertex_batch_size() const override { return kMaxVertexBatchSize; } GLContext* context_ = nullptr; GLuint program_ = 0; GLuint vao_ = 0; CircularBuffer vertex_buffer_; static const size_t kMaxCommands = 512; struct { GLenum prim_type; size_t vertex_offset; size_t vertex_count; } draw_commands_[kMaxCommands] = {{0}}; uint32_t draw_command_count_ = 0; GL4Bitmap* current_bitmap_ = nullptr; Vertex vertices_[kMaxVertexBatchSize]; }; } // namespace gl } // namespace ui } // namespace xe #endif // XENIA_UI_GL_GL4_ELEMENTAL_RENDERER_H_