1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens//
3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License.
5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at
6dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens//
9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and
13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License.
14dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
15dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// Buffer.cpp: Implements the Buffer class, representing storage of vertex and/or
16dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// index data. Implements GL buffer objects and related functionality.
17dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens// [OpenGL ES 2.0.24] section 2.9 page 21.
18dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
19dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "Buffer.h"
20dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
21dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "main.h"
22dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "VertexDataManager.h"
23dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens#include "IndexDataManager.h"
24dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
2514ee7622c090d91e637a336f1680eaa16a3b6c9dNicolas Capensnamespace es1
26dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
27dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
28e826ef020ff7d64878b98cf24e8acbc0e1bc99aaNicolas CapensBuffer::Buffer(GLuint name) : NamedObject(name)
29dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
30dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens    mContents = 0;
31dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens    mSize = 0;
32dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens    mUsage = GL_DYNAMIC_DRAW;
33dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
34dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
35dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas CapensBuffer::~Buffer()
36dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
37dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens    if(mContents)
38dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	{
39dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		mContents->destruct();
40dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	}
41dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
42dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
43dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capensvoid Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
44dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
45dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	if(mContents)
46dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	{
47dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		mContents->destruct();
48dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		mContents = 0;
49dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	}
50dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
51dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	mSize = size;
52dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	mUsage = usage;
53dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
54dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	if(size > 0)
55dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	{
56dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		const int padding = 1024;   // For SIMD processing of vertices
57dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		mContents = new sw::Resource(size + padding);
58dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
59dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		if(!mContents)
60dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		{
61dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens			return error(GL_OUT_OF_MEMORY);
62dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		}
63dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
64dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		if(data)
65dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		{
6653fae3e9065ab9beae3f1712d75b1638ded9206eNicolas Capens			memcpy((void*)mContents->data(), data, size);
67dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		}
68dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	}
69dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
70dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
71dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capensvoid Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
72dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
73dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	if(mContents)
74dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	{
75dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		char *buffer = (char*)mContents->lock(sw::PUBLIC);
76dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		memcpy(buffer + offset, data, size);
77dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens		mContents->unlock();
78dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	}
79dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
80dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
81dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capenssw::Resource *Buffer::getResource()
82dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens{
83dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens	return mContents;
84dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
85dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens
86dbf6fc836c3b7044b276d8b5477b079438b83102Nicolas Capens}
87