D3D9Wrapper::IDirect3DIndexBuffer9::IDirect3DIndexBuffer9( D3D9Base::LPDIRECT3DINDEXBUFFER9 pIndexBuffer )
    : IDirect3DResource9((D3D9Base::LPDIRECT3DRESOURCE9) pIndexBuffer)
{
    m_pIndexBuffer = pIndexBuffer;
    Locked = false;
}

D3D9Wrapper::IDirect3DIndexBuffer9* D3D9Wrapper::IDirect3DIndexBuffer9::GetIndexBuffer(D3D9Base::LPDIRECT3DINDEXBUFFER9 pIndexBuffer)
{
    return new D3D9Wrapper::IDirect3DIndexBuffer9(pIndexBuffer);
}

STDMETHODIMP D3D9Wrapper::IDirect3DIndexBuffer9::Lock(THIS_ UINT OffsetToLock,UINT SizeToLock,void** ppbData,DWORD Flags)
{
    if(IgnoringBufferLocks || g_Globals.VideoCaptureMode)
    {
        return m_pIndexBuffer->Lock(OffsetToLock, SizeToLock, ppbData, Flags);
    }
    if(Locked)
    {
        g_Globals.ErrorFile() << "Double lock\n";
        //return E_OUTOFMEMORY;
    }
    HRESULT hr = m_pIndexBuffer->Lock(OffsetToLock, SizeToLock, &m_LockData.pVideoBuffer, Flags);
    if(FAILED(hr))
    {
        return hr;
    }
    Locked = true;
    m_LockData.Handle = m_pIndexBuffer;
    m_LockData.Flags = Flags;
    m_LockData.OffsetToLock = OffsetToLock;
    m_LockData.SizeToLock = SizeToLock;
    m_LockData.pRAMBuffer = NULL;
    m_LockData.Create = false;
    D3DINDEXBUFFER_DESC Desc;
    m_pIndexBuffer->GetDesc(&Desc);
    if(m_LockData.SizeToLock == 0 && m_LockData.OffsetToLock == 0)
    {
        m_LockData.SizeToLock = Desc.Size;
    }
    ReportLockIndexBuffer(m_LockData, Desc);
    if(m_LockData.pRAMBuffer == NULL)
    {
        g_Globals.ErrorFile() << "Lock, m_LockData.pRAMBuffer == NULL\n";
        *ppbData = m_LockData.pVideoBuffer;
    }
    else
    {
        *ppbData = m_LockData.pRAMBuffer;
    }
    return hr;
}

STDMETHODIMP D3D9Wrapper::IDirect3DIndexBuffer9::Unlock(THIS)
{
    if(!IgnoringBufferLocks && !g_Globals.VideoCaptureMode)
    {
        Locked = false;
        if(m_LockData.pRAMBuffer == NULL)
        {
            g_Globals.ErrorFile() << "Unlock, m_LockData.pRAMBuffer == NULL\n";
        }
        else
        {
            memcpy(m_LockData.pVideoBuffer, m_LockData.pRAMBuffer, m_LockData.SizeToLock);
        }
    }
    return m_pIndexBuffer->Unlock();
}

STDMETHODIMP D3D9Wrapper::IDirect3DIndexBuffer9::GetDesc(THIS_ D3DINDEXBUFFER_DESC *pDesc)
{
    return m_pIndexBuffer->GetDesc( pDesc);
}