296 lines
6.5 KiB
NASM
296 lines
6.5 KiB
NASM
; b288.asm - las/mercury
|
|
[BITS 32]
|
|
;---
|
|
%define WIDTH 1280
|
|
%define HEIGHT 720
|
|
%ifdef DEBUG
|
|
%else
|
|
%define FULLSCREEN
|
|
%endif
|
|
;---
|
|
%include "inc/macros.inc"
|
|
%include "inc/windows.inc"
|
|
%include "inc/dxgi.inc"
|
|
%include "inc/d3d11.inc"
|
|
;---
|
|
struc TEXTURE_2D_SRV_UAV_RTV
|
|
.TEX: resd 1
|
|
.SRV: resd 1
|
|
.UAV: resd 1
|
|
.RTV: resd 1
|
|
endstruc
|
|
;---
|
|
DATA_SECTION WFMTEX
|
|
_waveFormatEx:
|
|
istruc WAVEFORMATEX
|
|
at WAVEFORMATEX.wFormatTag, dw WAVE_FORMAT_IEEE_FLOAT
|
|
at WAVEFORMATEX.nChannels, dw 2
|
|
at WAVEFORMATEX.nSamplesPerSec, dd 44100
|
|
at WAVEFORMATEX.nAvgBytesPerSec, dd 44100*4*2
|
|
at WAVEFORMATEX.nBlockAlign, dw 4*2
|
|
at WAVEFORMATEX.wBitsPerSample, dw 4*8
|
|
at WAVEFORMATEX.cbSize, dw 0
|
|
iend
|
|
|
|
DATA_SECTION WHDR
|
|
_waveHdr:
|
|
istruc WAVEHDR
|
|
at WAVEHDR.lpData, dd _sndBuffer
|
|
at WAVEHDR.dwBufferLength, dd _sndBufferEnd-_sndBuffer
|
|
at WAVEHDR.dwBytesRecorded, dd 0
|
|
at WAVEHDR.dwUser, dd 0
|
|
at WAVEHDR.dwFlags, dd WHDR_PREPARED
|
|
at WAVEHDR.dwLoops, dd 0
|
|
at WAVEHDR.lpNext, dd 0
|
|
at WAVEHDR.reserved, dd 0
|
|
iend
|
|
|
|
DATA_SECTION TIME
|
|
_mmTime:
|
|
istruc MMTIME
|
|
at MMTIME.wType, dd TIME_SAMPLES
|
|
at MMTIME.data, dd 0
|
|
iend
|
|
|
|
DATA_SECTION SC_DESC
|
|
_swapChainDesc:
|
|
istruc DXGI_SWAP_CHAIN_DESC
|
|
at DXGI_SWAP_CHAIN_DESC.Width, dd WIDTH
|
|
at DXGI_SWAP_CHAIN_DESC.Height, dd HEIGHT
|
|
at DXGI_SWAP_CHAIN_DESC.Numerator, dd 0
|
|
at DXGI_SWAP_CHAIN_DESC.Denominator, dd 1
|
|
at DXGI_SWAP_CHAIN_DESC.Format, dd DXGI_FORMAT_R16G16B16A16_FLOAT
|
|
at DXGI_SWAP_CHAIN_DESC.ScanlineOrdering, dd DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED
|
|
at DXGI_SWAP_CHAIN_DESC.Scaling, dd DXGI_MODE_SCALING_UNSPECIFIED
|
|
at DXGI_SWAP_CHAIN_DESC.Count, dd 1
|
|
at DXGI_SWAP_CHAIN_DESC.Quality, dd 0
|
|
at DXGI_SWAP_CHAIN_DESC.BufferUsage, dd DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT
|
|
at DXGI_SWAP_CHAIN_DESC.BufferCount, dd 1
|
|
at DXGI_SWAP_CHAIN_DESC.OutputWindow, dd 0
|
|
%ifdef FULLSCREEN
|
|
at DXGI_SWAP_CHAIN_DESC.Windowed, dd 0
|
|
%else
|
|
at DXGI_SWAP_CHAIN_DESC.Windowed, dd 0xffffffff
|
|
%endif
|
|
at DXGI_SWAP_CHAIN_DESC.SwapEffect, dd DXGI_SWAP_EFFECT_DISCARD
|
|
at DXGI_SWAP_CHAIN_DESC.Flags, dd 0
|
|
iend
|
|
|
|
DATA_SECTION TEX_DESC
|
|
_textureDesc:
|
|
istruc D3D11_TEXTURE2D_DESC
|
|
at D3D11_TEXTURE2D_DESC.Width, dd 0
|
|
at D3D11_TEXTURE2D_DESC.Height, dd 0
|
|
at D3D11_TEXTURE2D_DESC.MipLevels, dd 0
|
|
at D3D11_TEXTURE2D_DESC.ArraySize, dd 1
|
|
at D3D11_TEXTURE2D_DESC.Format, dd DXGI_FORMAT_R16G16B16A16_FLOAT
|
|
at D3D11_TEXTURE2D_DESC.Count, dd 1
|
|
at D3D11_TEXTURE2D_DESC.Quality, dd 0
|
|
at D3D11_TEXTURE2D_DESC.Usage, dd D3D11_USAGE_DEFAULT
|
|
at D3D11_TEXTURE2D_DESC.BindFlags, dd D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_UNORDERED_ACCESS
|
|
at D3D11_TEXTURE2D_DESC.CPUAccessFlags, dd 0
|
|
at D3D11_TEXTURE2D_DESC.MiscFlags, dd D3D11_RESOURCE_MISC_GENERATE_MIPS
|
|
iend
|
|
|
|
DATA_SECTION UUID
|
|
_uuidTexture2D:
|
|
dd 0x6f15aaf2
|
|
dw 0xd208
|
|
dw 0x4e89
|
|
db 0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c
|
|
|
|
DATA_SECTION SHADER
|
|
_src:
|
|
incbin "gpu/b288.hlsl"
|
|
db 0
|
|
_srcEnd:
|
|
_entrypoint:
|
|
db "cs", 0
|
|
_target:
|
|
db "cs_5_0", 0
|
|
_null:
|
|
dd 0
|
|
|
|
BSS_SECTION SND
|
|
_sndBuffer: resd 16384*4
|
|
_sndBufferEnd:
|
|
_waveHandle: resd 1024
|
|
|
|
BSS_SECTION D3D
|
|
_device: resd 1
|
|
_context: resd 1
|
|
_swapChain: resd 1
|
|
_backBufferTexture: resd 1
|
|
_backBufferUAV: resd 1
|
|
_computeShader: resd 1
|
|
_blob: resd 1
|
|
|
|
BSS_SECTION RES
|
|
_textureSRVUAVRTV: resb TEXTURE_2D_SRV_UAV_RTV_size
|
|
|
|
TEXT_SECTION SUR
|
|
_createSRVUAVRTV: ; target, width, height
|
|
pop eax
|
|
pop edi
|
|
pop dword [_textureDesc + D3D11_TEXTURE2D_DESC.Width]
|
|
pop dword [_textureDesc + D3D11_TEXTURE2D_DESC.Height]
|
|
push eax
|
|
|
|
lea eax, [edi + TEXTURE_2D_SRV_UAV_RTV.TEX]
|
|
push eax
|
|
push byte 0
|
|
push dword _textureDesc
|
|
com _device, ID3D11Device.CreateTexture2D
|
|
|
|
lea eax, [edi + TEXTURE_2D_SRV_UAV_RTV.SRV]
|
|
push eax
|
|
push byte 0
|
|
push dword [edi + TEXTURE_2D_SRV_UAV_RTV.TEX]
|
|
com _device, ID3D11Device.CreateShaderResourceView
|
|
|
|
lea eax, [edi + TEXTURE_2D_SRV_UAV_RTV.UAV]
|
|
push eax
|
|
push byte 0
|
|
push dword [edi + TEXTURE_2D_SRV_UAV_RTV.TEX]
|
|
com _device, ID3D11Device.CreateUnorderedAccessView
|
|
|
|
lea eax, [edi + TEXTURE_2D_SRV_UAV_RTV.RTV]
|
|
push eax
|
|
push byte 0
|
|
push dword [edi + TEXTURE_2D_SRV_UAV_RTV.TEX]
|
|
com _device, ID3D11Device.CreateRenderTargetView
|
|
ret
|
|
|
|
TEXT_SECTION MAINLOOP
|
|
global _start
|
|
_start:
|
|
%ifdef FULLSCREEN
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push dword WS_POPUP | WS_VISIBLE | WS_MAXIMIZE
|
|
push byte 0
|
|
push dword ATOM_STATIC
|
|
push byte 0
|
|
%else
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push dword HEIGHT
|
|
push dword WIDTH
|
|
push byte 0
|
|
push byte 0
|
|
push dword WS_POPUP | WS_VISIBLE
|
|
push byte 0
|
|
push dword ATOM_STATIC
|
|
push byte 0
|
|
%endif
|
|
call _CreateWindowExA@48
|
|
mov [_swapChainDesc + DXGI_SWAP_CHAIN_DESC.OutputWindow], eax
|
|
%ifdef FULLSCREEN
|
|
call _ShowCursor@4
|
|
%endif
|
|
push dword _context
|
|
push byte 0
|
|
push dword _device
|
|
push dword _swapChain
|
|
push dword _swapChainDesc
|
|
push byte D3D11_SDK_VERSION
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push byte D3D_DRIVER_TYPE_HARDWARE
|
|
push byte 0
|
|
call _D3D11CreateDeviceAndSwapChain@48
|
|
|
|
push byte 0
|
|
push dword _blob
|
|
push byte 0
|
|
push dword D3DCOMPILE_OPTIMIZATION_LEVEL3
|
|
push dword _target
|
|
push dword _entrypoint
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push dword _srcEnd-_src
|
|
push dword _src
|
|
call _D3DCompile@44
|
|
|
|
push dword _computeShader
|
|
push byte 0
|
|
com _blob, ID3D10Blob.GetBufferSize
|
|
push eax
|
|
com _blob, ID3D10Blob.GetBufferPointer
|
|
push eax
|
|
com _device, ID3D11Device.CreateComputeShader
|
|
|
|
push dword _backBufferTexture
|
|
push dword _uuidTexture2D
|
|
push byte 0
|
|
com _swapChain, IDXGISwapChain.GetBuffer
|
|
|
|
push dword _backBufferUAV
|
|
push byte 0
|
|
push dword [_backBufferTexture]
|
|
com _device, ID3D11Device.CreateUnorderedAccessView
|
|
|
|
push byte 0
|
|
push byte 0
|
|
push dword [_computeShader]
|
|
com _context, ID3D11DeviceContext.CSSetShader
|
|
|
|
push dword WIDTH
|
|
push dword HEIGHT
|
|
push dword _textureSRVUAVRTV
|
|
call _createSRVUAVRTV
|
|
|
|
_initSound:
|
|
push byte 0
|
|
push byte 0
|
|
push byte 0
|
|
push dword _waveFormatEx
|
|
push byte WAVE_MAPPER
|
|
push dword _waveHandle
|
|
call _waveOutOpen@24
|
|
|
|
push byte WAVEHDR_size
|
|
push dword _waveHdr
|
|
push dword [_waveHandle]
|
|
call _waveOutWrite@12
|
|
|
|
_mainloop:
|
|
push byte MMTIME_size
|
|
push dword _mmTime
|
|
push dword [_waveHandle]
|
|
call _waveOutGetPosition@12
|
|
|
|
push byte 0
|
|
push dword _backBufferUAV
|
|
push byte 1
|
|
push byte 0
|
|
com _context, ID3D11DeviceContext.CSSetUnorderedAccessViews
|
|
|
|
push byte 1
|
|
push byte 45
|
|
push byte 80
|
|
com _context, ID3D11DeviceContext.Dispatch
|
|
|
|
push byte 0
|
|
push byte 1
|
|
com _swapChain, IDXGISwapChain.Present
|
|
|
|
push byte VK_ESCAPE
|
|
call _GetAsyncKeyState@4
|
|
dec eax
|
|
js short _mainloop
|
|
_end:
|
|
push eax
|
|
call _ExitProcess@4 |