dxbc格式完成

This commit is contained in:
daiqingshuang
2025-06-10 17:21:36 +08:00
parent 3fd00fc20b
commit 181e56f6b3
4 changed files with 23 additions and 9 deletions

View File

@@ -73,7 +73,6 @@ class BindingManager:
sampler.set = sampled_textures[i].set
sampler.binding = sampled_textures[i].binding
def assign_bindings_dxil(self, shader_info: ShaderInfo):
"""为DXIL/DXBC着色器分配绑定点"""
if shader_info.stage == ShaderStage.VERTEX:

View File

@@ -102,6 +102,7 @@ class CodeGenerator:
'#include <SDL3/SDL_gpu.h>',
'#include <string>',
'#include <vector>',
'#include <array>',
'#include <unordered_map>',
'#include <cstdint>',
'#include "shader_handle.h"',
@@ -128,9 +129,19 @@ class CodeGenerator:
# 写入二进制内容
for info in binding_infos:
entry_point = info['entry_point']
hex_list = ', '.join(f'0x{byte:02x}' for byte in info['blob'])
with writer.block(f'static constexpr uint8_t {entry_point}_blob[] = ', '};'):
writer.write(hex_list)
blob_data = info['blob']
with writer.block(f'static constexpr std::array<uint8_t, {len(blob_data)}> {entry_point}_blob =', '};'):
# 每行16个字节提高可读性
for i in range(0, len(blob_data), 16):
chunk = blob_data[i:i + 16]
hex_str = ', '.join(f'0x{byte:02x}' for byte in chunk)
if i + 16 < len(blob_data):
hex_str += ','
writer.write(hex_str)
writer.write()
# Resource结构体
with writer.block('struct resource_t', '};'):
@@ -287,8 +298,8 @@ class CodeGenerator:
for info in shader_info:
with writer.indent(f'virtual SDL_GPUShader* create_{info['stage'].lower()}_shader(SDL_GPUDevice* in_gpu_device) override ''{', '}'):
writer.write('SDL_GPUShaderCreateInfo info{};')
writer.write(f'info.code = {global_vars.source_file_name}_shader_bindings::{info["entry_point"]}_blob;')
writer.write(f'info.code_size = sizeof({global_vars.source_file_name}_shader_bindings::{info["entry_point"]}_blob);')
writer.write(f'info.code = {global_vars.source_file_name}_shader_bindings::{info["entry_point"]}_blob.data();')
writer.write(f'info.code_size = {global_vars.source_file_name}_shader_bindings::{info["entry_point"]}_blob.size();')
writer.write(f'info.entrypoint = "{info["entry_point"]}";')
writer.write(f'info.format = SDL_GPU_SHADERFORMAT_{global_vars.target.value.upper()};')
writer.write(f'info.stage = SDL_GPU_SHADERSTAGE_{info['stage'].upper()};')
@@ -297,3 +308,4 @@ class CodeGenerator:
writer.write(f'info.num_storage_buffers = {info['num_resources'][ResourceType.STORAGE_BUFFER]};')
writer.write(f'info.num_uniform_buffers = {info['num_resources'][ResourceType.UNIFORM_BUFFER]};')
writer.write('return SDL_CreateGPUShader(in_gpu_device, &info);')
writer.write()

View File

@@ -25,6 +25,7 @@ def make_cmd(source_file: str, target: TargetFormat, stage: ShaderStage, entry_p
cmd = [
slangc_path,
source_file,
'-no-mangle',
'-entry', entry_point,
'-o', output_path,
'-target', target_flag,
@@ -34,8 +35,10 @@ def make_cmd(source_file: str, target: TargetFormat, stage: ShaderStage, entry_p
for include_path in global_vars.include_dirs:
cmd.extend(['-I', include_path])
if target in [TargetFormat.DXIL, TargetFormat.DXBC]:
cmd.extend(['-profile', 'sm_6_6'])
if target == TargetFormat.DXIL:
cmd.extend(['-profile', 'sm_6_0'])
elif target == TargetFormat.DXBC:
cmd.extend(['-profile', 'sm_5_1'])
return cmd

View File

@@ -350,7 +350,7 @@ class ShaderParser:
else:
# SDL3 GPU似乎不支持只读storage buffer这里可能需要特殊处理
return Resource(param['name'], ResourceType.STORAGE_BUFFER)
elif 'ConstantBuffer' in type_name or type_info.get('kind') == 'ConstantBuffer' or type_info.get('kind') == 'parameterBlock':
elif 'constantBuffer' in type_name or type_info.get('kind') == 'constantBuffer' or type_info.get('kind') == 'parameterBlock':
return Resource(param['name'], ResourceType.UNIFORM_BUFFER)
elif 'SamplerState' in type_name or 'Sampler' in type_name:
return Resource(param['name'], ResourceType.SAMPLER)