Home | History | Annotate | Download | only in d3d9
      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 
     13 namespace rx
     14 {
     15 
     16 Buffer9::Buffer9(rx::Renderer9 *renderer)
     17     : BufferD3D(),
     18       mRenderer(renderer),
     19       mSize(0)
     20 {}
     21 
     22 Buffer9::~Buffer9()
     23 {
     24     mSize = 0;
     25 }
     26 
     27 Buffer9 *Buffer9::makeBuffer9(BufferImpl *buffer)
     28 {
     29     ASSERT(HAS_DYNAMIC_TYPE(Buffer9*, buffer));
     30     return static_cast<Buffer9*>(buffer);
     31 }
     32 
     33 gl::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 
     59 void *Buffer9::getData()
     60 {
     61     return mMemory.data();
     62 }
     63 
     64 gl::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 
     85 gl::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
     99 gl::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 
    105 gl::Error Buffer9::unmap()
    106 {
    107     UNREACHABLE();
    108     return gl::Error(GL_INVALID_OPERATION);
    109 }
    110 
    111 void Buffer9::markTransformFeedbackUsage()
    112 {
    113     UNREACHABLE();
    114 }
    115 
    116 Renderer* Buffer9::getRenderer()
    117 {
    118     return mRenderer;
    119 }
    120 
    121 }
    122