1//
2// Copyright 2014 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// Buffer9.cpp Defines the Buffer9 class.
8
9#include "libGLESv2/renderer/d3d/d3d9/Buffer9.h"
10#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
11#include "libGLESv2/main.h"
12
13namespace rx
14{
15
16Buffer9::Buffer9(rx::Renderer9 *renderer)
17    : BufferD3D(),
18      mRenderer(renderer),
19      mSize(0)
20{}
21
22Buffer9::~Buffer9()
23{
24    mSize = 0;
25}
26
27Buffer9 *Buffer9::makeBuffer9(BufferImpl *buffer)
28{
29    ASSERT(HAS_DYNAMIC_TYPE(Buffer9*, buffer));
30    return static_cast<Buffer9*>(buffer);
31}
32
33gl::Error Buffer9::setData(const void* data, size_t size, GLenum usage)
34{
35    if (size > mMemory.size())
36    {
37        if (!mMemory.resize(size))
38        {
39            return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
40        }
41    }
42
43    mSize = size;
44    if (data)
45    {
46        memcpy(mMemory.data(), data, size);
47    }
48
49    invalidateStaticData();
50
51    if (usage == GL_STATIC_DRAW)
52    {
53        initializeStaticData();
54    }
55
56    return gl::Error(GL_NO_ERROR);
57}
58
59void *Buffer9::getData()
60{
61    return mMemory.data();
62}
63
64gl::Error Buffer9::setSubData(const void* data, size_t size, size_t offset)
65{
66    if (offset + size > mMemory.size())
67    {
68        if (!mMemory.resize(offset + size))
69        {
70            return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
71        }
72    }
73
74    mSize = std::max(mSize, offset + size);
75    if (data)
76    {
77        memcpy(mMemory.data() + offset, data, size);
78    }
79
80    invalidateStaticData();
81
82    return gl::Error(GL_NO_ERROR);
83}
84
85gl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
86{
87    // Note: this method is currently unreachable
88    Buffer9* sourceBuffer = makeBuffer9(source);
89    ASSERT(sourceBuffer);
90
91    memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size);
92
93    invalidateStaticData();
94
95    return gl::Error(GL_NO_ERROR);
96}
97
98// We do not support buffer mapping in D3D9
99gl::Error Buffer9::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
100{
101    UNREACHABLE();
102    return gl::Error(GL_INVALID_OPERATION);
103}
104
105gl::Error Buffer9::unmap()
106{
107    UNREACHABLE();
108    return gl::Error(GL_INVALID_OPERATION);
109}
110
111void Buffer9::markTransformFeedbackUsage()
112{
113    UNREACHABLE();
114}
115
116Renderer* Buffer9::getRenderer()
117{
118    return mRenderer;
119}
120
121}
122