blob: 6b88edaa3b34d26ea3d537196c8582c17d95751c [file] [log] [blame]
/*
* Copyright 2020 Google LLC
*
*/
/*
* Copyright (c) 2020, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 2 Clause License and
* the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
* was not distributed with this source code in the LICENSE file, you can
* obtain it at www.aomedia.org/license/software. If the Alliance for Open
* Media Patent License 1.0 was not distributed with this source code in the
* PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/
#pragma once
#include "dx\vp9dx_linear_allocator.h"
#include <d3d12.h>
#include <wrl.h>
#include <dxgi1_4.h>
#include <d3dx12.h>
enum {
DevMemPoolSize = 128,
HostMemPoolSize = 128,
ShaderPoolSize = 80,
};
enum BufferTypes {
ByteBuffer,
StructuredBuffer,
ConstBuffer,
BufferUnknown,
};
enum MemoryType {
DeviceOnly = 0,
DeviceUpload = 1,
HostRW = 2,
ReadBack = 3,
DeviceOnlyConst = 4,
};
using Microsoft::WRL::ComPtr;
struct GpuBufferObject {
ID3D12Resource* dev;
void* host_ptr;
size_t size;
size_t max_size;
MemoryType memtype;
const char* name;
};
struct dx_compute_context {
Microsoft::WRL::ComPtr<ID3D12Device> device;
Microsoft::WRL::ComPtr<ID3D12CommandQueue> queue;
Microsoft::WRL::ComPtr<ID3D12CommandQueue> queue_direct;
Microsoft::WRL::ComPtr<ID3D12GraphicsCommandList> command_list;
};
class av1_memory_manager_base {
public:
virtual GpuBufferObject* create_buffer(size_t size, MemoryType mem) = 0;
virtual void* host_allocate(size_t size, int align = 0) = 0;
};
struct av1_memory_allocator : public av1_memory_manager_base {
public:
av1_memory_allocator() {}
void setup(uint8_t* host_mem, size_t host_size);
void set_dx_context(dx_compute_context* ctx) { context = ctx; }
virtual GpuBufferObject* create_buffer(size_t size, MemoryType mem);
virtual void* host_allocate(size_t size, int align = 0);
void release();
private:
dx_compute_context* context;
GpuBufferObject dev_buffer_pool[DevMemPoolSize];
int shader_obj_count;
int host_obj_count;
int dev_obj_count;
uint8_t* host_base_addr;
size_t host_max_size;
size_t host_offset;
};
struct av1_memory_allocator_dummy : public av1_memory_manager_base {
public:
av1_memory_allocator_dummy() : host_ptr(0), device_ptr(0) {}
virtual GpuBufferObject* create_buffer(size_t size, MemoryType mem);
virtual void* host_allocate(size_t size, int align = 0);
size_t get_host_size() { return host_ptr; }
size_t get_device_size() { return device_ptr; }
private:
size_t host_ptr;
size_t device_ptr;
};