3 This file is part of gldbg
4 Copyright © 2009-2010 Mikko Rasa, Mikkosoft Productions
5 Distributed under the GPL
8 #include <msp/strings/formatter.h>
10 #include "arraystate.h"
11 #include "bufferstate.h"
17 BufferContent::BufferContent():
22 void BufferContent::update(const ArrayState &array)
24 if(array.stride!=stride)
27 stride = array.stride;
29 for(vector<Array>::iterator i=arrays.begin(); i!=arrays.end(); ++i)
30 if(i->kind==array.kind && i->index==array.index)
32 if(array.size!=i->size || array.type!=i->type || array.pointer!=i->offset)
44 vector<Array>::iterator place = arrays.end();
45 for(vector<Array>::iterator i=arrays.begin(); i!=arrays.end(); ++i)
46 if(i->offset>array.pointer)
52 arrays.insert(place, array);
55 void BufferContent::update_elements(GLenum type)
60 array.kind = GL_ELEMENT_ARRAY_BUFFER;
62 arrays.push_back(array);
63 stride = typesize(type);
65 else if(arrays.size()>1 || arrays.front().kind!=GL_ELEMENT_ARRAY_BUFFER)
69 if(arrays.front().type!=type)
71 arrays.front().type = type;
72 stride = typesize(type);
76 string BufferContent::describe() const
82 for(vector<Array>::const_iterator i=arrays.begin(); i!=arrays.end(); ++i)
85 if(i->kind==GL_VERTEX_ARRAY)
87 else if(i->kind==GL_NORMAL_ARRAY)
89 else if(i->kind==GL_COLOR_ARRAY)
91 else if(i->kind==GL_TEXTURE_COORD_ARRAY && i->index==0)
93 else if(i->kind==GL_ELEMENT_ARRAY_BUFFER)
96 char type[3] = { '?', 0, 0 };
99 else if(i->type==GL_DOUBLE)
101 else if(i->type==GL_INT || i->type==GL_UNSIGNED_INT)
103 else if(i->type==GL_SHORT || i->type==GL_UNSIGNED_SHORT)
105 else if(i->type==GL_BYTE || i->type==GL_UNSIGNED_BYTE)
108 if(i->type==GL_UNSIGNED_INT || i->type==GL_UNSIGNED_SHORT || i->type==GL_UNSIGNED_BYTE)
116 result += format("%c%d%s", kind, i->size, type);
123 BufferContent::Array::Array():
131 BufferContent::Array::Array(const ArrayState &a):
140 BufferState::BufferState():
143 usage(GL_STATIC_DRAW),
148 void BufferState::set_data(unsigned sz, const void *ptr, GLenum use)
153 data = new char[size];
155 set_sub_data(0, size, ptr);
156 content = BufferContent();
159 void BufferState::set_sub_data(unsigned off, unsigned sz, const void *ptr)
161 if(data && off+sz<=size)
163 const char *cptr = reinterpret_cast<const char *>(ptr);
164 copy(cptr, cptr+sz, data+off);
168 string BufferState::describe() const
172 const char *what = (content.arrays.front().kind==GL_ELEMENT_ARRAY_BUFFER ? "indices" : "vertices");
173 return format("%s, %d %s (%d bytes), %s",
174 content.describe(), size/content.stride, what, size, describe_enum(usage, ""));
177 return format("%d bytes, %s", size, describe_enum(usage, ""));