1d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones//
2d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Copyright 2014 The ANGLE Project Authors. All rights reserved.
3d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Use of this source code is governed by a BSD-style license that can be
4d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// found in the LICENSE file.
5d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones//
6d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
7d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones// Buffer9.cpp Defines the Buffer9 class.
8d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
9d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/d3d/d3d9/Buffer9.h"
10d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones#include "libGLESv2/renderer/d3d/d3d9/Renderer9.h"
110b7eef7c469bf717f7e1b57c6273f00d88e8b1d9Geoff Lang#include "libGLESv2/main.h"
12d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
13d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesnamespace rx
14d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
15d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
16d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9::Buffer9(rx::Renderer9 *renderer)
17d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    : BufferD3D(),
18d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones      mRenderer(renderer),
19d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones      mSize(0)
205c1e58d044616ba1b083dd44a2db3c3edb9890ebJamie Madill{}
21d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
22d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9::~Buffer9()
23d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
245c1e58d044616ba1b083dd44a2db3c3edb9890ebJamie Madill    mSize = 0;
25d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
26d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
27d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesBuffer9 *Buffer9::makeBuffer9(BufferImpl *buffer)
28d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
29d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    ASSERT(HAS_DYNAMIC_TYPE(Buffer9*, buffer));
30d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    return static_cast<Buffer9*>(buffer);
31d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
32d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
332a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::setData(const void* data, size_t size, GLenum usage)
34d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
35d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    if (size > mMemory.size())
36d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    {
375063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        if (!mMemory.resize(size))
385063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        {
392a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang            return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
405063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        }
41d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    }
42d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
43d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    mSize = size;
44d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    if (data)
45d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    {
46d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones        memcpy(mMemory.data(), data, size);
47d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    }
48d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
49d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    invalidateStaticData();
50d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
51d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    if (usage == GL_STATIC_DRAW)
52d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    {
53d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones        initializeStaticData();
54d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    }
552a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang
562a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    return gl::Error(GL_NO_ERROR);
57d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
58d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
59d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesvoid *Buffer9::getData()
60d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
61d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    return mMemory.data();
62d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
63d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
642a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::setSubData(const void* data, size_t size, size_t offset)
65d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
66d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    if (offset + size > mMemory.size())
67d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    {
685063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        if (!mMemory.resize(offset + size))
695063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        {
702a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang            return gl::Error(GL_OUT_OF_MEMORY, "Failed to resize internal buffer.");
715063f55a823348ef6ac774a10e12f410c98af7c8Geoff Lang        }
72d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    }
73d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
74d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    mSize = std::max(mSize, offset + size);
75d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    if (data)
76d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    {
77d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones        memcpy(mMemory.data() + offset, data, size);
78d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    }
79d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
80d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    invalidateStaticData();
812a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang
822a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    return gl::Error(GL_NO_ERROR);
83d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
84d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
852a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::copySubData(BufferImpl* source, GLintptr sourceOffset, GLintptr destOffset, GLsizeiptr size)
86d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
87cfaaf72fbd4b791c6eed6932e3e1e8741fd25d91Jamie Madill    // Note: this method is currently unreachable
88d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    Buffer9* sourceBuffer = makeBuffer9(source);
892a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    ASSERT(sourceBuffer);
902a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang
912a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    memcpy(mMemory.data() + destOffset, sourceBuffer->mMemory.data() + sourceOffset, size);
92d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
93d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    invalidateStaticData();
942a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang
952a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    return gl::Error(GL_NO_ERROR);
96d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
97d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
982a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang// We do not support buffer mapping in D3D9
992a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::map(size_t offset, size_t length, GLbitfield access, GLvoid **mapPtr)
100d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
101d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    UNREACHABLE();
1022a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    return gl::Error(GL_INVALID_OPERATION);
103d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
104d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
1052a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Langgl::Error Buffer9::unmap()
106d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
107d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    UNREACHABLE();
1082a1c15a1ab1852ab11fb8d12822c98aac11619aeGeoff Lang    return gl::Error(GL_INVALID_OPERATION);
109d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
110d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
111d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jonesvoid Buffer9::markTransformFeedbackUsage()
112d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
113d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    UNREACHABLE();
114d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
115d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
116d38f926ad0a14e8927db2468df840a3ecf330924Brandon JonesRenderer* Buffer9::getRenderer()
117d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones{
118d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones    return mRenderer;
119d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
120d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones
121d38f926ad0a14e8927db2468df840a3ecf330924Brandon Jones}
122