blob: fdec017482119b653585d8990e5f39a755265e9a [file] [log] [blame] [edit]
// Copyright 2022 The Chromium Authors
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FAKE_DRIVER_H_
#define FAKE_DRIVER_H_
#include <va/va.h>
#include "fake_buffer.h"
#include "fake_config.h"
#include "fake_context.h"
#include "fake_image.h"
#include "fake_surface.h"
#include "object_tracker.h"
#include "scoped_bo_mapping_factory.h"
namespace libvafake {
// FakeDriver is used to keep track of all the state that exists between a call
// to vaInitialize() and a call to vaTerminate(). All public methods are
// thread-safe.
class FakeDriver {
public:
// FakeDriver doesn't dup() or close() |drm_fd|, i.e., it's expected that the
// driver's user maintains the FD valid at least until after vaTerminate()
// returns.
explicit FakeDriver(int drm_fd);
FakeDriver(const FakeDriver&) = delete;
FakeDriver& operator=(const FakeDriver&) = delete;
~FakeDriver();
FakeConfig::IdType CreateConfig(VAProfile profile,
VAEntrypoint entrypoint,
std::vector<VAConfigAttrib> attrib_list);
bool ConfigExists(FakeConfig::IdType id);
const FakeConfig& GetConfig(FakeConfig::IdType id);
void DestroyConfig(FakeConfig::IdType id);
FakeSurface::IdType CreateSurface(unsigned int format,
unsigned int width,
unsigned int height,
std::vector<VASurfaceAttrib> attrib_list);
bool SurfaceExists(FakeSurface::IdType id);
const FakeSurface& GetSurface(FakeSurface::IdType id);
void DestroySurface(FakeSurface::IdType id);
FakeContext::IdType CreateContext(VAConfigID config_id,
int picture_width,
int picture_height,
int flag,
std::vector<VASurfaceID> render_targets);
bool ContextExists(FakeContext::IdType id);
const FakeContext& GetContext(FakeContext::IdType id);
void DestroyContext(FakeContext::IdType id);
FakeBuffer::IdType CreateBuffer(VAContextID context,
VABufferType type,
unsigned int size_per_element,
unsigned int num_elements,
const void* data);
bool BufferExists(FakeBuffer::IdType id);
const FakeBuffer& GetBuffer(FakeBuffer::IdType id);
void DestroyBuffer(FakeBuffer::IdType id);
void CreateImage(const VAImageFormat& format,
int width,
int height,
VAImage* va_image);
bool ImageExists(FakeImage::IdType id);
const FakeImage& GetImage(FakeImage::IdType id);
void DestroyImage(FakeImage::IdType id);
private:
// |scoped_bo_mapping_factory_| is used by FakeSurface to map BOs. It needs
// to be declared before |surface_| since we pass a reference to
// |scoped_bo_mapping_factory_| when creating a FakeSurface. Therefore,
// |scoped_bo_mapping_factory_| should outlive all FakeSurface instances.
ScopedBOMappingFactory scoped_bo_mapping_factory_;
ObjectTracker<FakeConfig> config_;
ObjectTracker<FakeSurface> surface_;
ObjectTracker<FakeContext> context_;
ObjectTracker<FakeBuffer> buffers_;
// The FakeImage instances in |images_| reference FakeBuffer instances in
// |buffers_|, so the latter should outlive the former.
ObjectTracker<FakeImage> images_;
};
} // namespace libvafake
#endif // FAKE_DRIVER_H_