1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas 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
6264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas 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.
14264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
15264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// Buffer.cpp: Implements the Buffer class, representing storage of vertex and/or
16264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens// index data. Implements GL buffer objects and related functionality.
17264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
18264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "Buffer.h"
19264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
20264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "main.h"
21264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "VertexDataManager.h"
22264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens#include "IndexDataManager.h"
23264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
24f4486fdf81c434bd06f06489901b6f825814fc17Nicolas Capensnamespace gl
25264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
26264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
27e826ef020ff7d64878b98cf24e8acbc0e1bc99aaNicolas CapensBuffer::Buffer(GLuint name) : NamedObject(name)
28264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	mContents = 0;
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	mSize = 0;
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	mUsage = GL_DYNAMIC_DRAW;
32264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
33264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
34264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas CapensBuffer::~Buffer()
35264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	if(mContents)
37264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	{
38264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		mContents->destruct();
39264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	}
40264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
41264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
42264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capensvoid Buffer::bufferData(const void *data, GLsizeiptr size, GLenum usage)
43264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
44264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	if(mContents)
45264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	{
46264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		mContents->destruct();
47264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		mContents = 0;
48264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	}
49264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
50264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	mSize = size;
51264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	mUsage = usage;
52264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
53264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	if(size > 0)
54264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	{
55264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		const int padding = 1024;   // For SIMD processing of vertices
56264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		mContents = new sw::Resource(size + padding);
57264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
58264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		if(!mContents)
59264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		{
60264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens			return error(GL_OUT_OF_MEMORY);
61264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		}
62264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
63264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		if(data)
64264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		{
65264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens			memcpy((void*)mContents->data(), data, size);
66264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		}
67264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	}
68264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
69264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
70264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capensvoid Buffer::bufferSubData(const void *data, GLsizeiptr size, GLintptr offset)
71264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
72264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	if(mContents)
73264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	{
74264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		char *buffer = (char*)mContents->lock(sw::PUBLIC);
75264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		memcpy(buffer + offset, data, size);
76264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens		mContents->unlock();
77264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	}
78264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
79264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
80264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capenssw::Resource *Buffer::getResource()
81264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens{
82264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens	return mContents;
83264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
84264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens
85264f1526da6dd0e20dd2fdd016df0f1c3244d4acNicolas Capens}
86