XECOUNT to countof.

This commit is contained in:
Ben Vanik 2014-08-16 17:58:33 -07:00
parent 187d0ad277
commit f2a9fa3bf9
30 changed files with 195 additions and 175 deletions

View File

@ -1017,7 +1017,7 @@ EMITTER(LOAD_VECTOR_SHL_I8, MATCH(I<OPCODE_LOAD_VECTOR_SHL, V128<>, I8<>>)) {
static void Emit(X64Emitter& e, const EmitArgType& i) { static void Emit(X64Emitter& e, const EmitArgType& i) {
if (i.src1.is_constant) { if (i.src1.is_constant) {
auto sh = i.src1.constant(); auto sh = i.src1.constant();
assert_true(sh < XECOUNT(lvsl_table)); assert_true(sh < poly::countof(lvsl_table));
e.mov(e.rax, (uintptr_t)&lvsl_table[sh]); e.mov(e.rax, (uintptr_t)&lvsl_table[sh]);
e.vmovaps(i.dest, e.ptr[e.rax]); e.vmovaps(i.dest, e.ptr[e.rax]);
} else { } else {
@ -1069,7 +1069,7 @@ EMITTER(LOAD_VECTOR_SHR_I8, MATCH(I<OPCODE_LOAD_VECTOR_SHR, V128<>, I8<>>)) {
static void Emit(X64Emitter& e, const EmitArgType& i) { static void Emit(X64Emitter& e, const EmitArgType& i) {
if (i.src1.is_constant) { if (i.src1.is_constant) {
auto sh = i.src1.constant(); auto sh = i.src1.constant();
assert_true(sh < XECOUNT(lvsr_table)); assert_true(sh < poly::countof(lvsr_table));
e.mov(e.rax, (uintptr_t)&lvsr_table[sh]); e.mov(e.rax, (uintptr_t)&lvsr_table[sh]);
e.vmovaps(i.dest, e.ptr[e.rax]); e.vmovaps(i.dest, e.ptr[e.rax]);
} else { } else {

View File

@ -55,7 +55,7 @@ RegisterAllocationPass::RegisterAllocationPass(const MachineInfo* machine_info)
} }
RegisterAllocationPass::~RegisterAllocationPass() { RegisterAllocationPass::~RegisterAllocationPass() {
for (size_t n = 0; n < XECOUNT(usage_sets_.all_sets); n++) { for (size_t n = 0; n < poly::countof(usage_sets_.all_sets); n++) {
if (!usage_sets_.all_sets[n]) { if (!usage_sets_.all_sets[n]) {
break; break;
} }
@ -171,7 +171,7 @@ int RegisterAllocationPass::Run(HIRBuilder* builder) {
void RegisterAllocationPass::DumpUsage(const char* name) { void RegisterAllocationPass::DumpUsage(const char* name) {
#if 0 #if 0
fprintf(stdout, "\n%s:\n", name); fprintf(stdout, "\n%s:\n", name);
for (size_t i = 0; i < XECOUNT(usage_sets_.all_sets); ++i) { for (size_t i = 0; i < poly::countof(usage_sets_.all_sets); ++i) {
auto usage_set = usage_sets_.all_sets[i]; auto usage_set = usage_sets_.all_sets[i];
if (usage_set) { if (usage_set) {
fprintf(stdout, "set %s:\n", usage_set->set->name); fprintf(stdout, "set %s:\n", usage_set->set->name);
@ -190,7 +190,7 @@ void RegisterAllocationPass::DumpUsage(const char* name) {
} }
void RegisterAllocationPass::PrepareBlockState() { void RegisterAllocationPass::PrepareBlockState() {
for (size_t i = 0; i < XECOUNT(usage_sets_.all_sets); ++i) { for (size_t i = 0; i < poly::countof(usage_sets_.all_sets); ++i) {
auto usage_set = usage_sets_.all_sets[i]; auto usage_set = usage_sets_.all_sets[i];
if (usage_set) { if (usage_set) {
usage_set->availability.set(); usage_set->availability.set();
@ -201,7 +201,7 @@ void RegisterAllocationPass::PrepareBlockState() {
} }
void RegisterAllocationPass::AdvanceUses(Instr* instr) { void RegisterAllocationPass::AdvanceUses(Instr* instr) {
for (size_t i = 0; i < XECOUNT(usage_sets_.all_sets); ++i) { for (size_t i = 0; i < poly::countof(usage_sets_.all_sets); ++i) {
auto usage_set = usage_sets_.all_sets[i]; auto usage_set = usage_sets_.all_sets[i];
if (!usage_set) { if (!usage_set) {
break; break;

View File

@ -294,7 +294,7 @@ void Disasm_bcx(InstrData& i, StringBuffer* str) {
} }
char s2[8] = {0}; char s2[8] = {0};
if (!select_bits(i.B.BO, 4, 4)) { if (!select_bits(i.B.BO, 4, 4)) {
xesnprintfa(s2, XECOUNT(s2), "cr%d, ", i.B.BI >> 2); xesnprintfa(s2, poly::countof(s2), "cr%d, ", i.B.BI >> 2);
} }
uint32_t nia; uint32_t nia;
if (i.B.AA) { if (i.B.AA) {
@ -310,7 +310,7 @@ void Disasm_bcctrx(InstrData& i, StringBuffer* str) {
const char* s0 = i.XL.LK ? "lr, " : ""; const char* s0 = i.XL.LK ? "lr, " : "";
char s2[8] = {0}; char s2[8] = {0};
if (!select_bits(i.XL.BO, 4, 4)) { if (!select_bits(i.XL.BO, 4, 4)) {
xesnprintfa(s2, XECOUNT(s2), "cr%d, ", i.XL.BI >> 2); xesnprintfa(s2, poly::countof(s2), "cr%d, ", i.XL.BI >> 2);
} }
str->Append("%-8s %s%sctr", i.type->name, s0, s2); str->Append("%-8s %s%sctr", i.type->name, s0, s2);
// TODO(benvanik): resolve target name? // TODO(benvanik): resolve target name?
@ -328,7 +328,7 @@ void Disasm_bclrx(InstrData& i, StringBuffer* str) {
} }
char s2[8] = {0}; char s2[8] = {0};
if (!select_bits(i.XL.BO, 4, 4)) { if (!select_bits(i.XL.BO, 4, 4)) {
xesnprintfa(s2, XECOUNT(s2), "cr%d, ", i.XL.BI >> 2); xesnprintfa(s2, poly::countof(s2), "cr%d, ", i.XL.BI >> 2);
} }
str->Append("%-8s %s%s", name, s1, s2); str->Append("%-8s %s%s", name, s1, s2);
} }

View File

@ -168,7 +168,8 @@ int PPCHIRBuilder::Emit(FunctionInfo* symbol_info, uint32_t flags) {
void PPCHIRBuilder::AnnotateLabel(uint64_t address, Label* label) { void PPCHIRBuilder::AnnotateLabel(uint64_t address, Label* label) {
char name_buffer[13]; char name_buffer[13];
xesnprintfa(name_buffer, XECOUNT(name_buffer), "loc_%.8X", (uint32_t)address); xesnprintfa(name_buffer, poly::countof(name_buffer), "loc_%.8X",
(uint32_t)address);
label->name = (char*)arena_->Alloc(sizeof(name_buffer)); label->name = (char*)arena_->Alloc(sizeof(name_buffer));
xe_copy_struct(label->name, name_buffer, sizeof(name_buffer)); xe_copy_struct(label->name, name_buffer, sizeof(name_buffer));
} }

View File

@ -25,7 +25,7 @@ void InstrOperand::Dump(std::string& out_str) {
} }
char buffer[32]; char buffer[32];
const size_t max_count = XECOUNT(buffer); const size_t max_count = poly::countof(buffer);
switch (type) { switch (type) {
case InstrOperand::kRegister: case InstrOperand::kRegister:
switch (reg.set) { switch (reg.set) {
@ -373,7 +373,7 @@ InstrType* GetInstrType(uint32_t code) {
// Slow lookup via linear scan. // Slow lookup via linear scan.
// This is primarily due to laziness. It could be made fast like the others. // This is primarily due to laziness. It could be made fast like the others.
for (size_t n = 0; for (size_t n = 0;
n < XECOUNT(alloy::frontend::ppc::tables::instr_table_scan); n++) { n < poly::countof(alloy::frontend::ppc::tables::instr_table_scan); n++) {
slot = &(alloy::frontend::ppc::tables::instr_table_scan[n]); slot = &(alloy::frontend::ppc::tables::instr_table_scan[n]);
if (slot->opcode == (code & slot->opcode_mask)) { if (slot->opcode == (code & slot->opcode_mask)) {
return slot; return slot;

View File

@ -13,6 +13,7 @@
#include <cmath> #include <cmath>
#include <alloy/frontend/ppc/ppc_instr.h> #include <alloy/frontend/ppc/ppc_instr.h>
#include <poly/poly.h>
namespace alloy { namespace alloy {
namespace frontend { namespace frontend {
@ -91,8 +92,8 @@ void Disasm_vspltisw(InstrData& i, StringBuffer* str);
namespace tables { namespace tables {
static InstrType** instr_table_prep(InstrType* unprep, int unprep_count, int a, static InstrType** instr_table_prep(InstrType* unprep, size_t unprep_count,
int b) { int a, int b) {
int prep_count = (int)pow(2.0, b - a + 1); int prep_count = (int)pow(2.0, b - a + 1);
InstrType** prep = (InstrType**)xe_calloc(prep_count * sizeof(void*)); InstrType** prep = (InstrType**)xe_calloc(prep_count * sizeof(void*));
for (int n = 0; n < unprep_count; n++) { for (int n = 0; n < unprep_count; n++) {
@ -102,7 +103,7 @@ static InstrType** instr_table_prep(InstrType* unprep, int unprep_count, int a,
return prep; return prep;
} }
static InstrType** instr_table_prep_63(InstrType* unprep, int unprep_count, static InstrType** instr_table_prep_63(InstrType* unprep, size_t unprep_count,
int a, int b) { int a, int b) {
// Special handling for A format instructions. // Special handling for A format instructions.
int prep_count = (int)pow(2.0, b - a + 1); int prep_count = (int)pow(2.0, b - a + 1);
@ -362,7 +363,7 @@ static InstrType instr_table_4_unprep[] = {
"Vector Logical XOR"), "Vector Logical XOR"),
}; };
static InstrType** instr_table_4 = instr_table_prep( static InstrType** instr_table_4 = instr_table_prep(
instr_table_4_unprep, XECOUNT(instr_table_4_unprep), 0, 11); instr_table_4_unprep, poly::countof(instr_table_4_unprep), 0, 11);
// Opcode = 19, index = bits 10-1 (10) // Opcode = 19, index = bits 10-1 (10)
static InstrType instr_table_19_unprep[] = { static InstrType instr_table_19_unprep[] = {
@ -382,7 +383,7 @@ static InstrType instr_table_19_unprep[] = {
"Branch Conditional to Count Register"), "Branch Conditional to Count Register"),
}; };
static InstrType** instr_table_19 = instr_table_prep( static InstrType** instr_table_19 = instr_table_prep(
instr_table_19_unprep, XECOUNT(instr_table_19_unprep), 1, 10); instr_table_19_unprep, poly::countof(instr_table_19_unprep), 1, 10);
// Opcode = 30, index = bits 4-1 (4) // Opcode = 30, index = bits 4-1 (4)
static InstrType instr_table_30_unprep[] = { static InstrType instr_table_30_unprep[] = {
@ -398,7 +399,7 @@ static InstrType instr_table_30_unprep[] = {
// INSTRUCTION(rldcrx, 0x78000012, MDS, General , 0), // INSTRUCTION(rldcrx, 0x78000012, MDS, General , 0),
}; };
static InstrType** instr_table_30 = instr_table_prep( static InstrType** instr_table_30 = instr_table_prep(
instr_table_30_unprep, XECOUNT(instr_table_30_unprep), 0, 0); instr_table_30_unprep, poly::countof(instr_table_30_unprep), 0, 0);
// Opcode = 31, index = bits 10-1 (10) // Opcode = 31, index = bits 10-1 (10)
static InstrType instr_table_31_unprep[] = { static InstrType instr_table_31_unprep[] = {
@ -645,7 +646,7 @@ static InstrType instr_table_31_unprep[] = {
"Store Vector Right Indexed LRU"), "Store Vector Right Indexed LRU"),
}; };
static InstrType** instr_table_31 = instr_table_prep( static InstrType** instr_table_31 = instr_table_prep(
instr_table_31_unprep, XECOUNT(instr_table_31_unprep), 1, 10); instr_table_31_unprep, poly::countof(instr_table_31_unprep), 1, 10);
// Opcode = 58, index = bits 1-0 (2) // Opcode = 58, index = bits 1-0 (2)
static InstrType instr_table_58_unprep[] = { static InstrType instr_table_58_unprep[] = {
@ -656,7 +657,7 @@ static InstrType instr_table_58_unprep[] = {
"Load Word Algebraic"), "Load Word Algebraic"),
}; };
static InstrType** instr_table_58 = instr_table_prep( static InstrType** instr_table_58 = instr_table_prep(
instr_table_58_unprep, XECOUNT(instr_table_58_unprep), 0, 1); instr_table_58_unprep, poly::countof(instr_table_58_unprep), 0, 1);
// Opcode = 59, index = bits 5-1 (5) // Opcode = 59, index = bits 5-1 (5)
static InstrType instr_table_59_unprep[] = { static InstrType instr_table_59_unprep[] = {
@ -682,7 +683,7 @@ static InstrType instr_table_59_unprep[] = {
"Floating Negative Multiply-Add [Single]"), "Floating Negative Multiply-Add [Single]"),
}; };
static InstrType** instr_table_59 = instr_table_prep( static InstrType** instr_table_59 = instr_table_prep(
instr_table_59_unprep, XECOUNT(instr_table_59_unprep), 1, 5); instr_table_59_unprep, poly::countof(instr_table_59_unprep), 1, 5);
// Opcode = 62, index = bits 1-0 (2) // Opcode = 62, index = bits 1-0 (2)
static InstrType instr_table_62_unprep[] = { static InstrType instr_table_62_unprep[] = {
@ -691,7 +692,7 @@ static InstrType instr_table_62_unprep[] = {
"Store Doubleword with Update"), "Store Doubleword with Update"),
}; };
static InstrType** instr_table_62 = instr_table_prep( static InstrType** instr_table_62 = instr_table_prep(
instr_table_62_unprep, XECOUNT(instr_table_62_unprep), 0, 1); instr_table_62_unprep, poly::countof(instr_table_62_unprep), 0, 1);
// Opcode = 63, index = bits 10-1 (10) // Opcode = 63, index = bits 10-1 (10)
// NOTE: the A format instructions need some special handling because // NOTE: the A format instructions need some special handling because
@ -751,7 +752,7 @@ static InstrType instr_table_63_unprep[] = {
"Floating Convert From Integer Doubleword"), "Floating Convert From Integer Doubleword"),
}; };
static InstrType** instr_table_63 = instr_table_prep_63( static InstrType** instr_table_63 = instr_table_prep_63(
instr_table_63_unprep, XECOUNT(instr_table_63_unprep), 1, 10); instr_table_63_unprep, poly::countof(instr_table_63_unprep), 1, 10);
// Main table, index = bits 31-26 (6) : (code >> 26) // Main table, index = bits 31-26 (6) : (code >> 26)
static InstrType instr_table_unprep[64] = { static InstrType instr_table_unprep[64] = {
@ -830,8 +831,8 @@ static InstrType instr_table_unprep[64] = {
INSTRUCTION(stfdu, 0xDC000000, D, General, D_FRT_RA_I, INSTRUCTION(stfdu, 0xDC000000, D, General, D_FRT_RA_I,
"Store Floating-Point Double with Update"), "Store Floating-Point Double with Update"),
}; };
static InstrType** instr_table = static InstrType** instr_table = instr_table_prep(
instr_table_prep(instr_table_unprep, XECOUNT(instr_table_unprep), 26, 31); instr_table_unprep, poly::countof(instr_table_unprep), 26, 31);
// Altivec instructions. // Altivec instructions.
// TODO(benvanik): build a table like the other instructions. // TODO(benvanik): build a table like the other instructions.

View File

@ -20,6 +20,11 @@
namespace poly { namespace poly {
template <typename T, size_t N>
size_t countof(T (&arr)[N]) {
return std::extent<T[N]>::value;
}
// Rounds up the given value to the given alignment. // Rounds up the given value to the given alignment.
template <typename T> template <typename T>
T align(T value, T alignment) { T align(T value, T alignment) {

View File

@ -10,20 +10,17 @@
#include <xenia/apu/audio_system.h> #include <xenia/apu/audio_system.h>
#include <xenia/apu/audio_driver.h> #include <xenia/apu/audio_driver.h>
#include <poly/threading.h> #include <poly/poly.h>
#include <xenia/emulator.h> #include <xenia/emulator.h>
#include <xenia/cpu/processor.h> #include <xenia/cpu/processor.h>
#include <xenia/cpu/xenon_thread_state.h> #include <xenia/cpu/xenon_thread_state.h>
using namespace xe; using namespace xe;
using namespace xe::apu; using namespace xe::apu;
using namespace xe::cpu; using namespace xe::cpu;
AudioSystem::AudioSystem(Emulator* emulator)
AudioSystem::AudioSystem(Emulator* emulator) : : emulator_(emulator), memory_(emulator->memory()), running_(false) {
emulator_(emulator), memory_(emulator->memory()),
running_(false) {
memset(clients_, 0, sizeof(clients_)); memset(clients_, 0, sizeof(clients_));
for (size_t i = 0; i < maximum_client_count_; ++i) { for (size_t i = 0; i < maximum_client_count_; ++i) {
client_wait_handles_[i] = CreateEvent(NULL, TRUE, FALSE, NULL); client_wait_handles_[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
@ -42,19 +39,16 @@ X_STATUS AudioSystem::Setup() {
// Let the processor know we want register access callbacks. // Let the processor know we want register access callbacks.
emulator_->memory()->AddMappedRange( emulator_->memory()->AddMappedRange(
0x7FEA0000, 0x7FEA0000, 0xFFFF0000, 0x0000FFFF, this,
0xFFFF0000,
0x0000FFFF,
this,
reinterpret_cast<MMIOReadCallback>(MMIOReadRegisterThunk), reinterpret_cast<MMIOReadCallback>(MMIOReadRegisterThunk),
reinterpret_cast<MMIOWriteCallback>(MMIOWriteRegisterThunk)); reinterpret_cast<MMIOWriteCallback>(MMIOWriteRegisterThunk));
// Setup worker thread state. This lets us make calls into guest code. // Setup worker thread state. This lets us make calls into guest code.
thread_state_ = new XenonThreadState( thread_state_ =
emulator_->processor()->runtime(), 0, 16 * 1024, 0); new XenonThreadState(emulator_->processor()->runtime(), 0, 16 * 1024, 0);
thread_state_->set_name("Audio Worker"); thread_state_->set_name("Audio Worker");
thread_block_ = (uint32_t)memory_->HeapAlloc( thread_block_ =
0, 2048, alloy::MEMORY_FLAG_ZERO); (uint32_t)memory_->HeapAlloc(0, 2048, alloy::MEMORY_FLAG_ZERO);
thread_state_->context()->r[13] = thread_block_; thread_state_->context()->r[13] = thread_block_;
// Create worker thread. // Create worker thread.
@ -78,7 +72,8 @@ void AudioSystem::ThreadStart() {
// Main run loop. // Main run loop.
while (running_) { while (running_) {
auto result = WaitForMultipleObjectsEx(maximum_client_count_, client_wait_handles_, FALSE, INFINITE, FALSE); auto result = WaitForMultipleObjectsEx(
maximum_client_count_, client_wait_handles_, FALSE, INFINITE, FALSE);
if (result == WAIT_FAILED) { if (result == WAIT_FAILED) {
DWORD err = GetLastError(); DWORD err = GetLastError();
assert_always(); assert_always();
@ -86,7 +81,8 @@ void AudioSystem::ThreadStart() {
} }
size_t pumped = 0; size_t pumped = 0;
if (result >= WAIT_OBJECT_0 && result <= WAIT_OBJECT_0 + (maximum_client_count_ - 1)) { if (result >= WAIT_OBJECT_0 &&
result <= WAIT_OBJECT_0 + (maximum_client_count_ - 1)) {
size_t index = result - WAIT_OBJECT_0; size_t index = result - WAIT_OBJECT_0;
do { do {
lock_.lock(); lock_.lock();
@ -94,12 +90,15 @@ void AudioSystem::ThreadStart() {
uint32_t client_callback_arg = clients_[index].wrapped_callback_arg; uint32_t client_callback_arg = clients_[index].wrapped_callback_arg;
lock_.unlock(); lock_.unlock();
if (client_callback) { if (client_callback) {
uint64_t args[] = { client_callback_arg }; uint64_t args[] = {client_callback_arg};
processor->Execute(thread_state_, client_callback, args, XECOUNT(args)); processor->Execute(thread_state_, client_callback, args,
poly::countof(args));
} }
pumped++; pumped++;
index++; index++;
} while (index < maximum_client_count_ && WaitForSingleObject(client_wait_handles_[index], 0) == WAIT_OBJECT_0); } while (index < maximum_client_count_ &&
WaitForSingleObject(client_wait_handles_[index], 0) ==
WAIT_OBJECT_0);
} }
if (!running_) { if (!running_) {
@ -118,8 +117,7 @@ void AudioSystem::ThreadStart() {
xe::Profiler::ThreadExit(); xe::Profiler::ThreadExit();
} }
void AudioSystem::Initialize() { void AudioSystem::Initialize() {}
}
void AudioSystem::Shutdown() { void AudioSystem::Shutdown() {
running_ = false; running_ = false;
@ -129,8 +127,8 @@ void AudioSystem::Shutdown() {
memory()->HeapFree(thread_block_, 0); memory()->HeapFree(thread_block_, 0);
} }
X_STATUS AudioSystem::RegisterClient( X_STATUS AudioSystem::RegisterClient(uint32_t callback, uint32_t callback_arg,
uint32_t callback, uint32_t callback_arg, size_t* out_index) { size_t* out_index) {
assert_true(unused_clients_.size()); assert_true(unused_clients_.size());
std::lock_guard<std::mutex> lock(lock_); std::lock_guard<std::mutex> lock(lock_);
@ -151,7 +149,7 @@ X_STATUS AudioSystem::RegisterClient(
auto mem = memory()->membase(); auto mem = memory()->membase();
poly::store_and_swap<uint32_t>(mem + ptr, callback_arg); poly::store_and_swap<uint32_t>(mem + ptr, callback_arg);
clients_[index] = { driver, callback, callback_arg, ptr }; clients_[index] = {driver, callback, callback_arg, ptr};
if (out_index) { if (out_index) {
*out_index = index; *out_index = index;
@ -176,7 +174,7 @@ void AudioSystem::UnregisterClient(size_t index) {
std::lock_guard<std::mutex> lock(lock_); std::lock_guard<std::mutex> lock(lock_);
assert_true(index < maximum_client_count_); assert_true(index < maximum_client_count_);
DestroyDriver(clients_[index].driver); DestroyDriver(clients_[index].driver);
clients_[index] = { 0 }; clients_[index] = {0};
unused_clients_.push(index); unused_clients_.push(index);
} }

View File

@ -9,6 +9,8 @@
#include <xenia/core/socket.h> #include <xenia/core/socket.h>
#include <poly/math.h>
#include <errno.h> #include <errno.h>
#include <mstcpip.h> #include <mstcpip.h>
#include <winsock2.h> #include <winsock2.h>
@ -121,7 +123,7 @@ int xe_socket_accept(socket_t socket, xe_socket_connection_t* out_client_info) {
int client_ip = client_addr.sin_addr.s_addr; int client_ip = client_addr.sin_addr.s_addr;
inet_ntop(AF_INET, &client_ip, inet_ntop(AF_INET, &client_ip,
out_client_info->addr, XECOUNT(out_client_info->addr)); out_client_info->addr, poly::countof(out_client_info->addr));
return 0; return 0;
} }
@ -250,7 +252,8 @@ int xe_socket_loop_poll(xe_socket_loop_t* loop,
} }
// Poll. // Poll.
int r = WSAPoll(loop->events, XECOUNT(loop->events), -1); int r = WSAPoll(loop->events, static_cast<ULONG>(poly::countof(loop->events)),
-1);
if (r == -1) { if (r == -1) {
return 1; return 1;
} }

View File

@ -243,8 +243,8 @@ const static struct {
0xE0000000, 0xFFFFFFFF, 0x00000000, // - physical 4k pages 0xE0000000, 0xFFFFFFFF, 0x00000000, // - physical 4k pages
}; };
int XenonMemory::MapViews(uint8_t* mapping_base) { int XenonMemory::MapViews(uint8_t* mapping_base) {
assert_true(XECOUNT(map_info) == XECOUNT(views_.all_views)); assert_true(poly::countof(map_info) == poly::countof(views_.all_views));
for (size_t n = 0; n < XECOUNT(map_info); n++) { for (size_t n = 0; n < poly::countof(map_info); n++) {
#if XE_PLATFORM_WIN32 #if XE_PLATFORM_WIN32
views_.all_views[n] = reinterpret_cast<uint8_t*>(MapViewOfFileEx( views_.all_views[n] = reinterpret_cast<uint8_t*>(MapViewOfFileEx(
mapping_, mapping_,
@ -268,7 +268,7 @@ XECLEANUP:
} }
void XenonMemory::UnmapViews() { void XenonMemory::UnmapViews() {
for (size_t n = 0; n < XECOUNT(views_.all_views); n++) { for (size_t n = 0; n < poly::countof(views_.all_views); n++) {
if (views_.all_views[n]) { if (views_.all_views[n]) {
#if XE_PLATFORM_WIN32 #if XE_PLATFORM_WIN32
UnmapViewOfFile(views_.all_views[n]); UnmapViewOfFile(views_.all_views[n]);

View File

@ -11,6 +11,7 @@
#include <algorithm> #include <algorithm>
#include <poly/math.h>
#include <xenia/cpu/cpu-private.h> #include <xenia/cpu/cpu-private.h>
#include <xenia/cpu/xenon_runtime.h> #include <xenia/cpu/xenon_runtime.h>
#include <xenia/export_resolver.h> #include <xenia/export_resolver.h>
@ -113,12 +114,12 @@ int XexModule::SetupLibraryImports(const xe_xex2_import_library_t* library) {
if (kernel_export) { if (kernel_export) {
if (info->thunk_address) { if (info->thunk_address) {
xesnprintfa(name, XECOUNT(name), "__imp_%s", kernel_export->name); xesnprintfa(name, poly::countof(name), "__imp_%s", kernel_export->name);
} else { } else {
xesnprintfa(name, XECOUNT(name), "%s", kernel_export->name); xesnprintfa(name, poly::countof(name), "%s", kernel_export->name);
} }
} else { } else {
xesnprintfa(name, XECOUNT(name), "__imp_%s_%.3X", library->name, xesnprintfa(name, poly::countof(name), "__imp_%s_%.3X", library->name,
info->ordinal); info->ordinal);
} }
@ -158,10 +159,10 @@ int XexModule::SetupLibraryImports(const xe_xex2_import_library_t* library) {
if (info->thunk_address) { if (info->thunk_address) {
if (kernel_export) { if (kernel_export) {
xesnprintfa(name, XECOUNT(name), "%s", kernel_export->name); xesnprintfa(name, poly::countof(name), "%s", kernel_export->name);
} else { } else {
xesnprintfa(name, XECOUNT(name), "__kernel_%s_%.3X", library->name, xesnprintfa(name, poly::countof(name), "__kernel_%s_%.3X",
info->ordinal); library->name, info->ordinal);
} }
// On load we have something like this in memory: // On load we have something like this in memory:
@ -398,17 +399,17 @@ int XexModule::FindSaveRest() {
if (!gplr_start) { if (!gplr_start) {
gplr_start = memory_->SearchAligned( gplr_start = memory_->SearchAligned(
start_address, end_address, start_address, end_address,
gprlr_code_values, XECOUNT(gprlr_code_values)); gprlr_code_values, poly::countof(gprlr_code_values));
} }
if (!fpr_start) { if (!fpr_start) {
fpr_start = memory_->SearchAligned( fpr_start = memory_->SearchAligned(
start_address, end_address, start_address, end_address,
fpr_code_values, XECOUNT(fpr_code_values)); fpr_code_values, poly::countof(fpr_code_values));
} }
if (!vmx_start) { if (!vmx_start) {
vmx_start = memory_->SearchAligned( vmx_start = memory_->SearchAligned(
start_address, end_address, start_address, end_address,
vmx_code_values, XECOUNT(vmx_code_values)); vmx_code_values, poly::countof(vmx_code_values));
} }
if (gplr_start && fpr_start && vmx_start) { if (gplr_start && fpr_start && vmx_start) {
break; break;
@ -422,7 +423,7 @@ int XexModule::FindSaveRest() {
if (gplr_start) { if (gplr_start) {
uint64_t address = gplr_start; uint64_t address = gplr_start;
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__savegprlr_%d", n); xesnprintfa(name, poly::countof(name), "__savegprlr_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_end_address(address + (31 - n) * 4 + 2 * 4); symbol_info->set_end_address(address + (31 - n) * 4 + 2 * 4);
@ -435,7 +436,7 @@ int XexModule::FindSaveRest() {
} }
address = gplr_start + 20 * 4; address = gplr_start + 20 * 4;
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__restgprlr_%d", n); xesnprintfa(name, poly::countof(name), "__restgprlr_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_end_address(address + (31 - n) * 4 + 3 * 4); symbol_info->set_end_address(address + (31 - n) * 4 + 3 * 4);
@ -450,7 +451,7 @@ int XexModule::FindSaveRest() {
if (fpr_start) { if (fpr_start) {
uint64_t address = fpr_start; uint64_t address = fpr_start;
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__savefpr_%d", n); xesnprintfa(name, poly::countof(name), "__savefpr_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_end_address(address + (31 - n) * 4 + 1 * 4); symbol_info->set_end_address(address + (31 - n) * 4 + 1 * 4);
@ -463,7 +464,7 @@ int XexModule::FindSaveRest() {
} }
address = fpr_start + (18 * 4) + (1 * 4); address = fpr_start + (18 * 4) + (1 * 4);
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__restfpr_%d", n); xesnprintfa(name, poly::countof(name), "__restfpr_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_end_address(address + (31 - n) * 4 + 1 * 4); symbol_info->set_end_address(address + (31 - n) * 4 + 1 * 4);
@ -483,7 +484,7 @@ int XexModule::FindSaveRest() {
// 64-127 rest // 64-127 rest
uint64_t address = vmx_start; uint64_t address = vmx_start;
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__savevmx_%d", n); xesnprintfa(name, poly::countof(name), "__savevmx_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_name(name); symbol_info->set_name(name);
@ -495,7 +496,7 @@ int XexModule::FindSaveRest() {
} }
address += 4; address += 4;
for (int n = 64; n <= 127; n++) { for (int n = 64; n <= 127; n++) {
xesnprintfa(name, XECOUNT(name), "__savevmx_%d", n); xesnprintfa(name, poly::countof(name), "__savevmx_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_name(name); symbol_info->set_name(name);
@ -507,7 +508,7 @@ int XexModule::FindSaveRest() {
} }
address = vmx_start + (18 * 2 * 4) + (1 * 4) + (64 * 2 * 4) + (1 * 4); address = vmx_start + (18 * 2 * 4) + (1 * 4) + (64 * 2 * 4) + (1 * 4);
for (int n = 14; n <= 31; n++) { for (int n = 14; n <= 31; n++) {
xesnprintfa(name, XECOUNT(name), "__restvmx_%d", n); xesnprintfa(name, poly::countof(name), "__restvmx_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_name(name); symbol_info->set_name(name);
@ -519,7 +520,7 @@ int XexModule::FindSaveRest() {
} }
address += 4; address += 4;
for (int n = 64; n <= 127; n++) { for (int n = 64; n <= 127; n++) {
xesnprintfa(name, XECOUNT(name), "__restvmx_%d", n); xesnprintfa(name, poly::countof(name), "__restvmx_%d", n);
FunctionInfo* symbol_info; FunctionInfo* symbol_info;
DeclareFunction(address, &symbol_info); DeclareFunction(address, &symbol_info);
symbol_info->set_name(name); symbol_info->set_name(name);

View File

@ -9,6 +9,7 @@
#include <xenia/export_resolver.h> #include <xenia/export_resolver.h>
#include <poly/math.h>
using namespace xe; using namespace xe;
@ -22,7 +23,7 @@ ExportResolver::~ExportResolver() {
void ExportResolver::RegisterTable( void ExportResolver::RegisterTable(
const char* library_name, KernelExport* exports, const size_t count) { const char* library_name, KernelExport* exports, const size_t count) {
ExportTable table; ExportTable table;
xestrcpya(table.name, XECOUNT(table.name), library_name); xestrcpya(table.name, poly::countof(table.name), library_name);
table.exports = exports; table.exports = exports;
table.count = count; table.count = count;
tables_.push_back(table); tables_.push_back(table);

View File

@ -9,6 +9,7 @@
#include <xenia/gpu/d3d11/d3d11_geometry_shader.h> #include <xenia/gpu/d3d11/d3d11_geometry_shader.h>
#include <poly/math.h>
#include <xenia/core/hash.h> #include <xenia/core/hash.h>
#include <xenia/gpu/gpu-private.h> #include <xenia/gpu/gpu-private.h>
#include <xenia/gpu/d3d11/d3d11_shader_resource.h> #include <xenia/gpu/d3d11/d3d11_shader_resource.h>
@ -98,7 +99,7 @@ ID3D10Blob* D3D11GeometryShader::Compile(const char* shader_source) {
} }
uint64_t hash = hash64(shader_source, strlen(shader_source)); // ? uint64_t hash = hash64(shader_source, strlen(shader_source)); // ?
char file_name[poly::max_path]; char file_name[poly::max_path];
xesnprintfa(file_name, XECOUNT(file_name), xesnprintfa(file_name, poly::countof(file_name),
"%s/gen_%.16llX.gs", "%s/gen_%.16llX.gs",
base_path, base_path,
hash); hash);

View File

@ -9,6 +9,7 @@
#include <xenia/gpu/d3d11/d3d11_graphics_driver.h> #include <xenia/gpu/d3d11/d3d11_graphics_driver.h>
#include <poly/math.h>
#include <xenia/core/hash.h> #include <xenia/core/hash.h>
#include <xenia/gpu/gpu-private.h> #include <xenia/gpu/gpu-private.h>
#include <xenia/gpu/buffer_resource.h> #include <xenia/gpu/buffer_resource.h>
@ -249,7 +250,7 @@ int D3D11GraphicsDriver::UpdateState(const DrawCommand& command) {
register_file_[XE_GPU_REG_RB_COLOR3_INFO].u32, register_file_[XE_GPU_REG_RB_COLOR3_INFO].u32,
}; };
ID3D11RenderTargetView* render_target_views[4] = { 0 }; ID3D11RenderTargetView* render_target_views[4] = { 0 };
for (int n = 0; n < XECOUNT(color_info); n++) { for (int n = 0; n < poly::countof(color_info); n++) {
auto cb = render_targets_.color_buffers[n]; auto cb = render_targets_.color_buffers[n];
uint32_t color_format = (color_info[n] >> 16) & 0xF; uint32_t color_format = (color_info[n] >> 16) & 0xF;
switch (color_format) { switch (color_format) {
@ -484,7 +485,7 @@ int D3D11GraphicsDriver::SetupBlendState(const DrawCommand& command) {
//blend_desc.AlphaToCoverageEnable = false; //blend_desc.AlphaToCoverageEnable = false;
// ? // ?
blend_desc.IndependentBlendEnable = true; blend_desc.IndependentBlendEnable = true;
for (int n = 0; n < XECOUNT(blend_control); n++) { for (int n = 0; n < poly::countof(blend_control); n++) {
// A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND // A2XX_RB_BLEND_CONTROL_COLOR_SRCBLEND
blend_desc.RenderTarget[n].SrcBlend = blend_map[(blend_control[n] & 0x0000001F) >> 0]; blend_desc.RenderTarget[n].SrcBlend = blend_map[(blend_control[n] & 0x0000001F) >> 0];
// A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND // A2XX_RB_BLEND_CONTROL_COLOR_DESTBLEND
@ -642,13 +643,14 @@ int D3D11GraphicsDriver::SetupShaders(const DrawCommand& command) {
// Set constant buffers. // Set constant buffers.
ID3D11Buffer* vs_constant_buffers[] = { ID3D11Buffer* vs_constant_buffers[] = {
state_.constant_buffers.float_constants, state_.constant_buffers.float_constants,
state_.constant_buffers.bool_constants, state_.constant_buffers.bool_constants,
state_.constant_buffers.loop_constants, state_.constant_buffers.loop_constants,
state_.constant_buffers.vs_consts, state_.constant_buffers.vs_consts,
}; };
context_->VSSetConstantBuffers(0, XECOUNT(vs_constant_buffers), context_->VSSetConstantBuffers(
vs_constant_buffers); 0, static_cast<UINT>(poly::countof(vs_constant_buffers)),
vs_constant_buffers);
// Setup input layout (as encoded in vertex shader). // Setup input layout (as encoded in vertex shader).
auto vs = static_cast<D3D11VertexShaderResource*>(command.vertex_shader); auto vs = static_cast<D3D11VertexShaderResource*>(command.vertex_shader);
@ -666,12 +668,13 @@ int D3D11GraphicsDriver::SetupShaders(const DrawCommand& command) {
// Set constant buffers. // Set constant buffers.
ID3D11Buffer* vs_constant_buffers[] = { ID3D11Buffer* vs_constant_buffers[] = {
state_.constant_buffers.float_constants, state_.constant_buffers.float_constants,
state_.constant_buffers.bool_constants, state_.constant_buffers.bool_constants,
state_.constant_buffers.loop_constants, state_.constant_buffers.loop_constants,
}; };
context_->PSSetConstantBuffers(0, XECOUNT(vs_constant_buffers), context_->PSSetConstantBuffers(
vs_constant_buffers); 0, static_cast<UINT>(poly::countof(vs_constant_buffers)),
vs_constant_buffers);
} else { } else {
context_->PSSetShader(nullptr, nullptr, 0); context_->PSSetShader(nullptr, nullptr, 0);
return 1; return 1;
@ -824,7 +827,7 @@ int D3D11GraphicsDriver::RebuildRenderTargets(uint32_t width,
SCOPE_profile_cpu_f("gpu"); SCOPE_profile_cpu_f("gpu");
// Remove old versions. // Remove old versions.
for (int n = 0; n < XECOUNT(render_targets_.color_buffers); n++) { for (int n = 0; n < poly::countof(render_targets_.color_buffers); n++) {
auto& cb = render_targets_.color_buffers[n]; auto& cb = render_targets_.color_buffers[n];
SafeRelease(cb.buffer); SafeRelease(cb.buffer);
SafeRelease(cb.color_view_8888); SafeRelease(cb.color_view_8888);
@ -841,7 +844,7 @@ int D3D11GraphicsDriver::RebuildRenderTargets(uint32_t width,
return 0; return 0;
} }
for (int n = 0; n < XECOUNT(render_targets_.color_buffers); n++) { for (int n = 0; n < poly::countof(render_targets_.color_buffers); n++) {
auto& cb = render_targets_.color_buffers[n]; auto& cb = render_targets_.color_buffers[n];
D3D11_TEXTURE2D_DESC color_buffer_desc; D3D11_TEXTURE2D_DESC color_buffer_desc;
xe_zero_struct(&color_buffer_desc, sizeof(color_buffer_desc)); xe_zero_struct(&color_buffer_desc, sizeof(color_buffer_desc));

View File

@ -9,6 +9,7 @@
#include <xenia/gpu/d3d11/d3d11_graphics_system.h> #include <xenia/gpu/d3d11/d3d11_graphics_system.h>
#include <poly/math.h>
#include <xenia/emulator.h> #include <xenia/emulator.h>
#include <xenia/gpu/gpu-private.h> #include <xenia/gpu/gpu-private.h>
#include <xenia/gpu/d3d11/d3d11_graphics_driver.h> #include <xenia/gpu/d3d11/d3d11_graphics_driver.h>
@ -89,7 +90,7 @@ void D3D11GraphicsSystem::Initialize() {
0, // software driver HMODULE 0, // software driver HMODULE
flags, flags,
feature_levels, feature_levels,
XECOUNT(feature_levels), static_cast<UINT>(poly::countof(feature_levels)),
D3D11_SDK_VERSION, D3D11_SDK_VERSION,
&device_, &device_,
&actual_feature_level, &actual_feature_level,

View File

@ -11,6 +11,7 @@
#include <algorithm> #include <algorithm>
#include <poly/math.h>
#include <xenia/gpu/gpu-private.h> #include <xenia/gpu/gpu-private.h>
#include <xenia/gpu/d3d11/d3d11_window.h> #include <xenia/gpu/d3d11/d3d11_window.h>
@ -267,14 +268,23 @@ bool D3D11ProfilerDisplay::SetupShaders() {
} }
D3D11_INPUT_ELEMENT_DESC element_descs[] = { D3D11_INPUT_ELEMENT_DESC element_descs[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0, }, {
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0, }, "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0,
{ "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0, }, D3D11_INPUT_PER_VERTEX_DATA, 0,
},
{
"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT,
D3D11_INPUT_PER_VERTEX_DATA, 0,
},
{
"COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, D3D11_APPEND_ALIGNED_ELEMENT,
D3D11_INPUT_PER_VERTEX_DATA, 0,
},
}; };
hr = device->CreateInputLayout(element_descs, (UINT)XECOUNT(element_descs), hr = device->CreateInputLayout(
vs_code_blob->GetBufferPointer(), element_descs, (UINT)poly::countof(element_descs),
vs_code_blob->GetBufferSize(), vs_code_blob->GetBufferPointer(), vs_code_blob->GetBufferSize(),
&shader_layout_); &shader_layout_);
if (FAILED(hr)) { if (FAILED(hr)) {
XELOGE("Failed to create profiler input layout"); XELOGE("Failed to create profiler input layout");
return false; return false;
@ -298,7 +308,7 @@ bool D3D11ProfilerDisplay::SetupFont() {
auto device = window_->device(); auto device = window_->device();
// Setup font lookup table. // Setup font lookup table.
for (uint32_t i = 0; i < XECOUNT(font_description_.char_offsets); ++i) { for (uint32_t i = 0; i < poly::countof(font_description_.char_offsets); ++i) {
font_description_.char_offsets[i] = 206; font_description_.char_offsets[i] = 206;
} }
for (uint32_t i = 'A'; i <= 'Z'; ++i) { for (uint32_t i = 'A'; i <= 'Z'; ++i) {
@ -468,12 +478,14 @@ void D3D11ProfilerDisplay::Begin() {
font_sampler_state_, font_sampler_state_,
nullptr, nullptr,
}; };
context->PSSetSamplers(0, XECOUNT(ps_samplers), ps_samplers); context->PSSetSamplers(0, static_cast<UINT>(poly::countof(ps_samplers)),
ID3D11ShaderResourceView* ps_resources[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] = { ps_samplers);
font_texture_view_, ID3D11ShaderResourceView*
nullptr, ps_resources[D3D11_COMMONSHADER_INPUT_RESOURCE_SLOT_COUNT] = {
}; font_texture_view_, nullptr,
context->PSSetShaderResources(0, XECOUNT(ps_resources), ps_resources); };
context->PSSetShaderResources(
0, static_cast<UINT>(poly::countof(ps_resources)), ps_resources);
context->IASetInputLayout(shader_layout_); context->IASetInputLayout(shader_layout_);
} }
@ -483,19 +495,23 @@ void D3D11ProfilerDisplay::End() {
D3D11ProfilerDisplay::Vertex* D3D11ProfilerDisplay::AllocateVertices( D3D11ProfilerDisplay::Vertex* D3D11ProfilerDisplay::AllocateVertices(
D3D_PRIMITIVE_TOPOLOGY primitive, size_t count) { D3D_PRIMITIVE_TOPOLOGY primitive, size_t count) {
if (draw_state_.vertex_index + count > XECOUNT(draw_state_.vertex_buffer)) { if (draw_state_.vertex_index + count >
poly::countof(draw_state_.vertex_buffer)) {
Flush(); Flush();
} }
assert_true(draw_state_.vertex_index + count <= XECOUNT(draw_state_.vertex_buffer)); assert_true(draw_state_.vertex_index + count <=
poly::countof(draw_state_.vertex_buffer));
size_t head = draw_state_.vertex_index; size_t head = draw_state_.vertex_index;
draw_state_.vertex_index += count; draw_state_.vertex_index += count;
if (draw_state_.command_index && if (draw_state_.command_index &&
draw_state_.commands[draw_state_.command_index - 1].primitive == primitive) { draw_state_.commands[draw_state_.command_index - 1].primitive ==
primitive) {
draw_state_.commands[draw_state_.command_index - 1].vertex_count += count; draw_state_.commands[draw_state_.command_index - 1].vertex_count += count;
} else { } else {
assert_true(draw_state_.command_index < XECOUNT(draw_state_.commands)); assert_true(draw_state_.command_index <
poly::countof(draw_state_.commands));
draw_state_.commands[draw_state_.command_index].primitive = primitive; draw_state_.commands[draw_state_.command_index].primitive = primitive;
draw_state_.commands[draw_state_.command_index].vertex_count = count; draw_state_.commands[draw_state_.command_index].vertex_count = count;
++draw_state_.command_index; ++draw_state_.command_index;

View File

@ -9,6 +9,7 @@
#include <xenia/gpu/d3d11/d3d11_shader_resource.h> #include <xenia/gpu/d3d11/d3d11_shader_resource.h>
#include <poly/math.h>
#include <xenia/core/hash.h> #include <xenia/core/hash.h>
#include <xenia/gpu/gpu-private.h> #include <xenia/gpu/gpu-private.h>
#include <xenia/gpu/d3d11/d3d11_geometry_shader.h> #include <xenia/gpu/d3d11/d3d11_geometry_shader.h>
@ -49,7 +50,7 @@ ID3D10Blob* D3D11ShaderCompile(XE_GPU_SHADER_TYPE type,
} }
size_t hash = hash64(disasm_source, strlen(disasm_source)); // ? size_t hash = hash64(disasm_source, strlen(disasm_source)); // ?
char file_name[poly::max_path]; char file_name[poly::max_path];
xesnprintfa(file_name, XECOUNT(file_name), xesnprintfa(file_name, poly::countof(file_name),
"%s/gen_%.16llX.%s", "%s/gen_%.16llX.%s",
base_path, base_path,
hash, hash,
@ -105,7 +106,7 @@ D3D11VertexShaderResource::D3D11VertexShaderResource(
D3D11VertexShaderResource::~D3D11VertexShaderResource() { D3D11VertexShaderResource::~D3D11VertexShaderResource() {
SafeRelease(handle_); SafeRelease(handle_);
SafeRelease(input_layout_); SafeRelease(input_layout_);
for (int i = 0; i < XECOUNT(geometry_shaders_); ++i) { for (int i = 0; i < poly::countof(geometry_shaders_); ++i) {
delete geometry_shaders_[i]; delete geometry_shaders_[i];
} }
xe_free(translated_src_); xe_free(translated_src_);

View File

@ -9,7 +9,7 @@
#include <xenia/gpu/graphics_system.h> #include <xenia/gpu/graphics_system.h>
#include <poly/threading.h> #include <poly/poly.h>
#include <xenia/emulator.h> #include <xenia/emulator.h>
#include <xenia/cpu/processor.h> #include <xenia/cpu/processor.h>
#include <xenia/gpu/command_processor.h> #include <xenia/gpu/command_processor.h>
@ -199,5 +199,5 @@ void GraphicsSystem::DispatchInterruptCallback(
} }
uint64_t args[] = { source, interrupt_callback_data_ }; uint64_t args[] = { source, interrupt_callback_data_ };
processor_->ExecuteInterrupt( processor_->ExecuteInterrupt(
cpu, interrupt_callback_, args, XECOUNT(args)); cpu, interrupt_callback_, args, poly::countof(args));
} }

View File

@ -9,6 +9,7 @@
#include <xenia/gpu/shader_resource.h> #include <xenia/gpu/shader_resource.h>
#include <poly/math.h>
#include <xenia/gpu/xenos/ucode_disassembler.h> #include <xenia/gpu/xenos/ucode_disassembler.h>
@ -188,7 +189,7 @@ void ShaderResource::GatherVertexFetch(const instr_fetch_vtx_t* vtx) {
auto& desc = inputs.descs[n]; auto& desc = inputs.descs[n];
auto& info = desc.info; auto& info = desc.info;
if (desc.fetch_slot == fetch_slot) { if (desc.fetch_slot == fetch_slot) {
assert_true(info.element_count <= XECOUNT(info.elements)); assert_true(info.element_count <= poly::countof(info.elements));
// It may not hold that all strides are equal, but I hope it does. // It may not hold that all strides are equal, but I hope it does.
assert_true(!vtx->stride || info.stride_words == vtx->stride); assert_true(!vtx->stride || info.stride_words == vtx->stride);
el = &info.elements[info.element_count++]; el = &info.elements[info.element_count++];
@ -197,7 +198,7 @@ void ShaderResource::GatherVertexFetch(const instr_fetch_vtx_t* vtx) {
} }
if (!el) { if (!el) {
assert_not_zero(vtx->stride); assert_not_zero(vtx->stride);
assert_true(inputs.count + 1 < XECOUNT(inputs.descs)); assert_true(inputs.count + 1 < poly::countof(inputs.descs));
auto& desc = inputs.descs[inputs.count++]; auto& desc = inputs.descs[inputs.count++];
desc.input_index = inputs.count - 1; desc.input_index = inputs.count - 1;
desc.fetch_slot = fetch_slot; desc.fetch_slot = fetch_slot;
@ -251,7 +252,7 @@ void ShaderResource::GatherVertexFetch(const instr_fetch_vtx_t* vtx) {
void ShaderResource::GatherTextureFetch(const xenos::instr_fetch_tex_t* tex) { void ShaderResource::GatherTextureFetch(const xenos::instr_fetch_tex_t* tex) {
// TODO(benvanik): check dest_swiz to see if we are writing anything. // TODO(benvanik): check dest_swiz to see if we are writing anything.
assert_true(sampler_inputs_.count + 1 < XECOUNT(sampler_inputs_.descs)); assert_true(sampler_inputs_.count + 1 < poly::countof(sampler_inputs_.descs));
auto& input = sampler_inputs_.descs[sampler_inputs_.count++]; auto& input = sampler_inputs_.descs[sampler_inputs_.count++];
input.input_index = sampler_inputs_.count - 1; input.input_index = sampler_inputs_.count - 1;
input.fetch_slot = tex->const_idx & 0xF; // ? input.fetch_slot = tex->const_idx & 0xF; // ?

View File

@ -9,6 +9,7 @@
#include <xenia/kernel/fs/devices/disc_image_device.h> #include <xenia/kernel/fs/devices/disc_image_device.h>
#include <poly/math.h>
#include <xenia/kernel/fs/gdfx.h> #include <xenia/kernel/fs/gdfx.h>
#include <xenia/kernel/fs/devices/disc_image_entry.h> #include <xenia/kernel/fs/devices/disc_image_entry.h>
@ -57,12 +58,12 @@ Entry* DiscImageDevice::ResolvePath(const char* path) {
// Walk the path, one separator at a time. // Walk the path, one separator at a time.
// We copy it into the buffer and shift it left over and over. // We copy it into the buffer and shift it left over and over.
char remaining[poly::max_path]; char remaining[poly::max_path];
xestrcpya(remaining, XECOUNT(remaining), path); xestrcpya(remaining, poly::countof(remaining), path);
while (remaining[0]) { while (remaining[0]) {
char* next_slash = strchr(remaining, '\\'); char* next_slash = strchr(remaining, '\\');
if (next_slash == remaining) { if (next_slash == remaining) {
// Leading slash - shift // Leading slash - shift
xestrcpya(remaining, XECOUNT(remaining), remaining + 1); xestrcpya(remaining, poly::countof(remaining), remaining + 1);
continue; continue;
} }
@ -82,7 +83,7 @@ Entry* DiscImageDevice::ResolvePath(const char* path) {
if (!next_slash) { if (!next_slash) {
break; break;
} }
xestrcpya(remaining, XECOUNT(remaining), next_slash + 1); xestrcpya(remaining, poly::countof(remaining), next_slash + 1);
} }
Entry::Type type = gdfx_entry->attributes & X_FILE_ATTRIBUTE_DIRECTORY ? Entry::Type type = gdfx_entry->attributes & X_FILE_ATTRIBUTE_DIRECTORY ?

View File

@ -9,6 +9,7 @@
#include <xenia/kernel/fs/devices/stfs_container_device.h> #include <xenia/kernel/fs/devices/stfs_container_device.h>
#include <poly/math.h>
#include <xenia/kernel/fs/stfs.h> #include <xenia/kernel/fs/stfs.h>
#include <xenia/kernel/fs/devices/stfs_container_entry.h> #include <xenia/kernel/fs/devices/stfs_container_entry.h>
@ -57,12 +58,12 @@ Entry* STFSContainerDevice::ResolvePath(const char* path) {
// Walk the path, one separator at a time. // Walk the path, one separator at a time.
// We copy it into the buffer and shift it left over and over. // We copy it into the buffer and shift it left over and over.
char remaining[poly::max_path]; char remaining[poly::max_path];
xestrcpya(remaining, XECOUNT(remaining), path); xestrcpya(remaining, poly::countof(remaining), path);
while (remaining[0]) { while (remaining[0]) {
char* next_slash = strchr(remaining, '\\'); char* next_slash = strchr(remaining, '\\');
if (next_slash == remaining) { if (next_slash == remaining) {
// Leading slash - shift // Leading slash - shift
xestrcpya(remaining, XECOUNT(remaining), remaining + 1); xestrcpya(remaining, poly::countof(remaining), remaining + 1);
continue; continue;
} }
@ -82,7 +83,7 @@ Entry* STFSContainerDevice::ResolvePath(const char* path) {
if (!next_slash) { if (!next_slash) {
break; break;
} }
xestrcpya(remaining, XECOUNT(remaining), next_slash + 1); xestrcpya(remaining, poly::countof(remaining), next_slash + 1);
} }
Entry::Type type = stfs_entry->attributes & X_FILE_ATTRIBUTE_DIRECTORY ? Entry::Type type = stfs_entry->attributes & X_FILE_ATTRIBUTE_DIRECTORY ?

View File

@ -11,6 +11,7 @@
#include <xenia/kernel/fs/gdfx.h> #include <xenia/kernel/fs/gdfx.h>
#include <poly/math.h>
using namespace xe; using namespace xe;
using namespace xe::kernel; using namespace xe::kernel;
@ -105,7 +106,7 @@ GDFX::Error GDFX::Verify(ParseState& state) {
0x00000000, 0x0000FB20, 0x00020600, 0x0FD90000, 0x00000000, 0x0000FB20, 0x00020600, 0x0FD90000,
}; };
bool magic_found = false; bool magic_found = false;
for (size_t n = 0; n < XECOUNT(likely_offsets); n++) { for (size_t n = 0; n < poly::countof(likely_offsets); n++) {
state.game_offset = likely_offsets[n]; state.game_offset = likely_offsets[n];
if (VerifyMagic(state, state.game_offset + (32 * kXESectorSize))) { if (VerifyMagic(state, state.game_offset + (32 * kXESectorSize))) {
magic_found = true; magic_found = true;

View File

@ -219,7 +219,7 @@ X_STATUS XThread::Create() {
} }
char thread_name[32]; char thread_name[32];
xesnprintfa(thread_name, XECOUNT(thread_name), "XThread%04X", handle()); xesnprintfa(thread_name, poly::countof(thread_name), "XThread%04X", handle());
set_name(thread_name); set_name(thread_name);
uint32_t proc_mask = creation_params_.creation_flags >> 24; uint32_t proc_mask = creation_params_.creation_flags >> 24;
@ -366,22 +366,19 @@ void XThread::Execute() {
// If a XapiThreadStartup value is present, we use that as a trampoline. // If a XapiThreadStartup value is present, we use that as a trampoline.
// Otherwise, we are a raw thread. // Otherwise, we are a raw thread.
if (creation_params_.xapi_thread_startup) { if (creation_params_.xapi_thread_startup) {
uint64_t args[] = { uint64_t args[] = {creation_params_.start_address,
creation_params_.start_address, creation_params_.start_context};
creation_params_.start_context kernel_state()->processor()->Execute(thread_state_,
}; creation_params_.xapi_thread_startup,
kernel_state()->processor()->Execute( args, poly::countof(args));
thread_state_,
creation_params_.xapi_thread_startup, args, XECOUNT(args));
} else { } else {
// Run user code. // Run user code.
uint64_t args[] = { uint64_t args[] = {creation_params_.start_context};
creation_params_.start_context
};
int exit_code = (int)kernel_state()->processor()->Execute( int exit_code = (int)kernel_state()->processor()->Execute(
thread_state_, thread_state_, creation_params_.start_address, args,
creation_params_.start_address, args, XECOUNT(args)); poly::countof(args));
// If we got here it means the execute completed without an exit being called. // If we got here it means the execute completed without an exit being
// called.
// Treat the return code as an implicit exit code. // Treat the return code as an implicit exit code.
Exit(exit_code); Exit(exit_code);
} }
@ -459,7 +456,7 @@ void XThread::DeliverAPCs(void* data) {
thread->scratch_address_ + 12, thread->scratch_address_ + 12,
}; };
processor->ExecuteInterrupt( processor->ExecuteInterrupt(
0, kernel_routine, kernel_args, XECOUNT(kernel_args)); 0, kernel_routine, kernel_args, poly::countof(kernel_args));
normal_routine = poly::load_and_swap<uint32_t>(scratch_ptr + 0); normal_routine = poly::load_and_swap<uint32_t>(scratch_ptr + 0);
normal_context = poly::load_and_swap<uint32_t>(scratch_ptr + 4); normal_context = poly::load_and_swap<uint32_t>(scratch_ptr + 4);
system_arg1 = poly::load_and_swap<uint32_t>(scratch_ptr + 8); system_arg1 = poly::load_and_swap<uint32_t>(scratch_ptr + 8);
@ -472,7 +469,7 @@ void XThread::DeliverAPCs(void* data) {
// normal_routine(normal_context, system_arg1, system_arg2) // normal_routine(normal_context, system_arg1, system_arg2)
uint64_t normal_args[] = { normal_context, system_arg1, system_arg2 }; uint64_t normal_args[] = { normal_context, system_arg1, system_arg2 };
processor->ExecuteInterrupt( processor->ExecuteInterrupt(
0, normal_routine, normal_args, XECOUNT(normal_args)); 0, normal_routine, normal_args, poly::countof(normal_args));
thread->LockApc(); thread->LockApc();
} }
} }
@ -498,7 +495,7 @@ void XThread::RundownAPCs() {
// rundown_routine(apc) // rundown_routine(apc)
uint64_t args[] = { apc_address }; uint64_t args[] = { apc_address };
kernel_state()->processor()->ExecuteInterrupt( kernel_state()->processor()->ExecuteInterrupt(
0, rundown_routine, args, XECOUNT(args)); 0, rundown_routine, args, poly::countof(args));
} }
} }
UnlockApc(); UnlockApc();

View File

@ -19,7 +19,7 @@
* #include <xenia/kernel/util/export_table_post.inc> * #include <xenia/kernel/util/export_table_post.inc>
* export_resolver_->RegisterTable( * export_resolver_->RegisterTable(
* "my_module.xex", * "my_module.xex",
* my_module_export_table, XECOUNT(my_module_export_table)); * my_module_export_table, poly::countof(my_module_export_table));
*/ */

View File

@ -13,6 +13,7 @@
#include <vector> #include <vector>
#include <gflags/gflags.h> #include <gflags/gflags.h>
#include <poly/math.h>
#include <third_party/crypto/rijndael-alg-fst.h> #include <third_party/crypto/rijndael-alg-fst.h>
#include <third_party/crypto/rijndael-alg-fst.c> #include <third_party/crypto/rijndael-alg-fst.c>
#include <third_party/mspack/lzx.h> #include <third_party/mspack/lzx.h>
@ -237,7 +238,7 @@ int xe_xex2_read_header(const uint8_t *addr, const size_t length,
break; break;
case XEX_HEADER_IMPORT_LIBRARIES: case XEX_HEADER_IMPORT_LIBRARIES:
{ {
const size_t max_count = XECOUNT(header->import_libraries); const size_t max_count = poly::countof(header->import_libraries);
size_t count = poly::load_and_swap<uint32_t>(pp + 0x08); size_t count = poly::load_and_swap<uint32_t>(pp + 0x08);
assert_true(count <= max_count); assert_true(count <= max_count);
if (count > max_count) { if (count > max_count) {
@ -263,7 +264,7 @@ int xe_xex2_read_header(const uint8_t *addr, const size_t length,
for (size_t i = 0, j = 0; i < string_table_size;) { for (size_t i = 0, j = 0; i < string_table_size;) {
assert_true(j <= 0xFF); assert_true(j <= 0xFF);
if (j == name_index) { if (j == name_index) {
xestrcpya(library->name, XECOUNT(library->name), xestrcpya(library->name, poly::countof(library->name),
string_table + i); string_table + i);
break; break;
} }
@ -292,7 +293,7 @@ int xe_xex2_read_header(const uint8_t *addr, const size_t length,
break; break;
case XEX_HEADER_STATIC_LIBRARIES: case XEX_HEADER_STATIC_LIBRARIES:
{ {
const size_t max_count = XECOUNT(header->static_libraries); const size_t max_count = poly::countof(header->static_libraries);
size_t count = (opt_header->length - 4) / 16; size_t count = (opt_header->length - 4) / 16;
assert_true(count <= max_count); assert_true(count <= max_count);
if (count > max_count) { if (count > max_count) {

View File

@ -9,6 +9,7 @@
#include <xenia/kernel/xam_module.h> #include <xenia/kernel/xam_module.h>
#include <poly/math.h>
#include <xenia/export_resolver.h> #include <xenia/export_resolver.h>
#include <xenia/kernel/kernel_state.h> #include <xenia/kernel/kernel_state.h>
#include <xenia/kernel/xam_private.h> #include <xenia/kernel/xam_private.h>
@ -27,7 +28,7 @@ XamModule::XamModule(Emulator* emulator, KernelState* kernel_state) :
}; };
#include <xenia/kernel/util/export_table_post.inc> #include <xenia/kernel/util/export_table_post.inc>
export_resolver_->RegisterTable( export_resolver_->RegisterTable(
"xam.xex", xam_export_table, XECOUNT(xam_export_table)); "xam.xex", xam_export_table, poly::countof(xam_export_table));
// Register all exported functions. // Register all exported functions.
xam::RegisterContentExports(export_resolver_, kernel_state); xam::RegisterContentExports(export_resolver_, kernel_state);

View File

@ -10,7 +10,7 @@
#include <xenia/kernel/xboxkrnl_module.h> #include <xenia/kernel/xboxkrnl_module.h>
#include <gflags/gflags.h> #include <gflags/gflags.h>
#include <poly/math.h>
#include <xenia/emulator.h> #include <xenia/emulator.h>
#include <xenia/export_resolver.h> #include <xenia/export_resolver.h>
#include <xenia/kernel/kernel_state.h> #include <xenia/kernel/kernel_state.h>
@ -34,8 +34,8 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state) :
#include <xenia/kernel/xboxkrnl_table.inc> #include <xenia/kernel/xboxkrnl_table.inc>
}; };
#include <xenia/kernel/util/export_table_post.inc> #include <xenia/kernel/util/export_table_post.inc>
export_resolver_->RegisterTable( export_resolver_->RegisterTable("xboxkrnl.exe", xboxkrnl_export_table,
"xboxkrnl.exe", xboxkrnl_export_table, XECOUNT(xboxkrnl_export_table)); poly::countof(xboxkrnl_export_table));
// Register all exported functions. // Register all exported functions.
xboxkrnl::RegisterAudioExports(export_resolver_, kernel_state); xboxkrnl::RegisterAudioExports(export_resolver_, kernel_state);
@ -113,7 +113,7 @@ XboxkrnlModule::XboxkrnlModule(Emulator* emulator, KernelState* kernel_state) :
pExLoadedCommandLine); pExLoadedCommandLine);
char command_line[] = "\"default.xex\""; char command_line[] = "\"default.xex\"";
xe_copy_memory(mem + pExLoadedCommandLine, 1024, xe_copy_memory(mem + pExLoadedCommandLine, 1024,
command_line, XECOUNT(command_line) + 1); command_line, poly::countof(command_line) + 1);
// XboxKrnlVersion (8b) // XboxKrnlVersion (8b)
// Kernel version, looks like 2b.2b.2b.2b. // Kernel version, looks like 2b.2b.2b.2b.

View File

@ -13,6 +13,7 @@
#include <gflags/gflags.h> #include <gflags/gflags.h>
#include <poly/main.h> #include <poly/main.h>
#include <poly/math.h>
#include <xenia/common.h> #include <xenia/common.h>
DEFINE_bool(fast_stdout, false, DEFINE_bool(fast_stdout, false,
@ -63,7 +64,7 @@ void xe_log_line(const char* file_path, const uint32_t line_number,
char buffer[2048]; char buffer[2048];
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
xe_format_log_line(buffer, XECOUNT(buffer), xe_format_log_line(buffer, poly::countof(buffer),
file_path, line_number, function_name, level_char, file_path, line_number, function_name, level_char,
fmt, args); fmt, args);
va_end(args); va_end(args);
@ -88,7 +89,7 @@ void xe_handle_fatal(
char buffer[2048]; char buffer[2048];
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
xe_format_log_line(buffer, XECOUNT(buffer), xe_format_log_line(buffer, poly::countof(buffer),
file_path, line_number, function_name, 'X', file_path, line_number, function_name, 'X',
fmt, args); fmt, args);
va_end(args); va_end(args);

View File

@ -82,15 +82,6 @@
#endif // MSVC #endif // MSVC
typedef XECACHEALIGN volatile void xe_aligned_void_t; typedef XECACHEALIGN volatile void xe_aligned_void_t;
#if XE_COMPILER_MSVC
// http://msdn.microsoft.com/en-us/library/ms175773.aspx
#define XECOUNT(array) _countof(array)
#elif XE_COMPILER_GNUC
#define XECOUNT(array) (sizeof(array) / sizeof(__typeof__(array[0])))
#else
#define XECOUNT(array) (sizeof(array) / sizeof(array[0]))
#endif // MSVC
#define XEFAIL() goto XECLEANUP #define XEFAIL() goto XECLEANUP
#define XEEXPECT(expr) if (!(expr) ) { goto XECLEANUP; } #define XEEXPECT(expr) if (!(expr) ) { goto XECLEANUP; }
#define XEEXPECTTRUE(expr) if (!(expr) ) { goto XECLEANUP; } #define XEEXPECTTRUE(expr) if (!(expr) ) { goto XECLEANUP; }

View File

@ -17,13 +17,9 @@ using namespace xe;
DEFINE_string(target, "", "Specifies the target .xex or .iso to execute."); DEFINE_string(target, "", "Specifies the target .xex or .iso to execute.");
int xenia_run(std::vector<std::wstring>& args) { int xenia_run(std::vector<std::wstring>& args) {
int result_code = 1;
Profiler::Initialize(); Profiler::Initialize();
Profiler::ThreadEnter("main"); Profiler::ThreadEnter("main");
Emulator* emulator = NULL;
// Grab path from the flag or unnamed argument. // Grab path from the flag or unnamed argument.
if (!FLAGS_target.size() && args.size() < 2) { if (!FLAGS_target.size() && args.size() < 2) {
google::ShowUsageWithFlags("xenia-run"); google::ShowUsageWithFlags("xenia-run");
@ -45,15 +41,17 @@ int xenia_run(std::vector<std::wstring>& args) {
// Create platform abstraction layer. // Create platform abstraction layer.
xe_pal_options_t pal_options; xe_pal_options_t pal_options;
xe_zero_struct(&pal_options, sizeof(pal_options)); xe_zero_struct(&pal_options, sizeof(pal_options));
XEEXPECTZERO(xe_pal_init(pal_options)); if (xe_pal_init(pal_options)) {
XELOGE("Failed to initialize PAL");
return 1;
}
// Create the emulator. // Create the emulator.
emulator = new Emulator(L""); auto emulator = std::make_unique<Emulator>(L"");
XEEXPECTNOTNULL(emulator);
X_STATUS result = emulator->Setup(); X_STATUS result = emulator->Setup();
if (XFAILED(result)) { if (XFAILED(result)) {
XELOGE("Failed to setup emulator: %.8X", result); XELOGE("Failed to setup emulator: %.8X", result);
XEFAIL(); return 1;
} }
// Launch based on file type. // Launch based on file type.
@ -72,18 +70,13 @@ int xenia_run(std::vector<std::wstring>& args) {
} }
if (XFAILED(result)) { if (XFAILED(result)) {
XELOGE("Failed to launch target: %.8X", result); XELOGE("Failed to launch target: %.8X", result);
XEFAIL(); return 1;
} }
result_code = 0; emulator.reset();
XECLEANUP:
delete emulator;
if (result_code) {
XEFATAL("Failed to launch emulator: %d", result_code);
}
Profiler::Dump(); Profiler::Dump();
Profiler::Shutdown(); Profiler::Shutdown();
return result_code; return 0;
} }
DEFINE_ENTRY_POINT(L"xenia-run", L"xenia-run some.xex", xenia_run); DEFINE_ENTRY_POINT(L"xenia-run", L"xenia-run some.xex", xenia_run);