summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/render/bgfx/chainmanager.cpp
blob: 23358109f6a907e7372bb4cd496515399ae14e52 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
//============================================================
//
//  chainmanager.cpp - BGFX shader chain manager
//
//  Maintains a string-to-entry lookup of BGFX shader effect
//  chains, defined by chain.h and read by chainreader.h
//
//============================================================

#include "emu.h"

#include <rapidjson/document.h>

#include <bx/readerwriter.h>
#include <bx/crtimpl.h>

#include "chainmanager.h"
#include "chainreader.h"
#include "chain.h"

using namespace rapidjson;

chain_manager::~chain_manager()
{
	for (std::pair<std::string, bgfx_chain*> chain : m_chains)
	{
		delete chain.second;
	}
	m_chains.clear();
}

bgfx_chain* chain_manager::chain(std::string name, running_machine& machine, uint32_t window_index)
{
	std::map<std::string, bgfx_chain*>::iterator iter = m_chains.find(name + std::to_string(window_index));
	if (iter != m_chains.end())
	{
		return iter->second;
	}

	return load_chain(name, machine, window_index);
}

bgfx_chain* chain_manager::load_chain(std::string name, running_machine& machine, uint32_t window_index)
{
	if (name.length() < 5 || (name.compare(name.length() - 5, 5, ".json")!= 0))
	{
		name = name + ".json";
	}
	std::string path = std::string(m_options.bgfx_path()) + "/chains/" + name;

	bx::CrtFileReader reader;
	bx::open(&reader, path.c_str());

	int32_t size(bx::getSize(&reader));

	char* data = new char[size + 1];
	bx::read(&reader, reinterpret_cast<void*>(data), size);
	bx::close(&reader);
	data[size] = 0;

	Document document;
	document.Parse<0>(data);
	bgfx_chain* chain = chain_reader::read_from_value(document, name + ": ", m_options, machine, window_index, m_textures, m_targets, m_effects, m_width, m_height);

	m_chains[name + std::to_string(window_index)] = chain;

	return chain;
}