Ben Russell (300178622) 18c8d4c53a performance improvements
2015-10-08 10:16:16 +13:00

138 lines
4.4 KiB
Lua

--[[
DCT + IDCT mod for Iceball
WARNING: This mod is covered by software patents.
Not that I actually know which ones, but due to the nature of this being
useful for any possible video application whatsoever, it's guaranteed to be covered
by some stupid bullshit patent that doesn't have any right to exist,
but exists anyway because the US govt are a bunch of fucking morons.
After all, it's a GPU implementation of a DCT in GLSL,
which is really fucking useful for video,
and oddly enough is what I intend to use it for eventually.
This means that it's probably covered by these hypothetical patents:
* Method for calculating a DCT on a GPU
* Method for calculating a DCT using GLSL
* Method for calculating a fast DCT
* Method for calculating a fast DCT on a GPU
* Method for calculating anything related to fourier transforms on a GPU
* Method for storing signed colour data in an 8bpc space
* Method for compressing (in the audio sense, not in the data sense) values into an 8bpc space
* Method for compressing values into an 8bpc space, number two
* Method for compressing values into an 8bpc space, number three
* Method for converting between colourspaces on a GPU
* Method for running programs on a GPU, filed because the clerk at the patent office wasn't looking
* Method for calculating a DCT in a video game, on a GPU
* Method for calculating a DCT in a networked video game, on a GPU
* Method for sending a DCT algorithm over a network
* Method for sending a GLSL shader over a network
* And any apparatus for applying any of those methods.
So please, if you use this software, either:
* Ensure that you are in a country that doesn't give software patents any more respect than they deserve (read: none),
or:
* Don't tell IBM.
Thank you.
P.S. If you own any patents that covers this piece of software,
please let me know so I can work out how to make a modified version
that doesn't violate any of your patents.
P.P.S. No, I am not going to settle for a patent licensing deal.
]]
if not (USE_FBO and USE_GLSL_21) then return end
-- FBO spam
fbo_dct_apply1 = client.fbo_create(screen_width, screen_height, true)
fbo_dct_apply2 = client.fbo_create(screen_width, screen_height, false)
fbo_dct_unapply1 = client.fbo_create(screen_width, screen_height, false)
fbo_dct_unapply2 = client.fbo_create(screen_width, screen_height, false)
dofile("pkg/gm/dct/shaders.lua")
--dofile("pkg/gm/dct/shaders-130.lua") -- int-based, notably slower
function dct_apply_scene()
if fbo_dct_apply1 then
shader_dct_apply.set_uniform_i("tex0", 0)
shader_dct_apply.set_uniform_f("smul", screen_width, screen_height)
shader_dct_apply.set_uniform_f("smul_inv", 1.0/screen_width, 1.0/screen_height)
client.fbo_use(fbo_dct_apply2)
shader_dct_apply.set_uniform_f("is_init", 1.0)
shader_dct_apply.set_uniform_f("is_fini", 0.0)
shader_dct_apply.set_uniform_f("is_inverse", 0.0)
shader_dct_apply.push()
client.img_blit(fbo_dct_apply1, 0, 0)
shader_dct_apply.pop()
client.fbo_use(fbo_dct_unapply1)
shader_dct_apply.set_uniform_f("is_init", 0.0)
shader_dct_apply.set_uniform_f("is_fini", 0.0)
shader_dct_apply.set_uniform_f("is_inverse", 0.0)
shader_dct_apply.push()
client.img_blit(fbo_dct_apply2, 0, 0)
shader_dct_apply.pop()
client.fbo_use(fbo_dct_unapply2)
shader_dct_apply.set_uniform_f("is_init", 0.0)
shader_dct_apply.set_uniform_f("is_fini", 0.0)
shader_dct_apply.set_uniform_f("is_inverse", 1.0)
shader_dct_apply.push()
client.img_blit(fbo_dct_unapply1, 0, 0)
shader_dct_apply.pop()
client.fbo_use(nil)
shader_dct_apply.set_uniform_f("is_init", 0.0)
shader_dct_apply.set_uniform_f("is_fini", 1.0)
shader_dct_apply.set_uniform_f("is_inverse", 1.0)
shader_dct_apply.push()
client.img_blit(fbo_dct_unapply2, 0, 0)
shader_dct_apply.pop()
end
end
do
local s_hook_render = client.hook_render
function client.hook_render(...)
local s_fbo_use = client.fbo_use
local is_using_nil = true
local s_img_dump = client.img_dump
function client.fbo_use(fbo, ...)
if fbo == nil then
is_using_nil = true
return s_fbo_use(fbo_dct_apply1, ...)
else
is_using_nil = false
return s_fbo_use(fbo, ...)
end
end
function client.img_dump(...)
if is_using_nil then s_fbo_use(nil) end
local ret = {s_img_dump(...)}
if is_using_nil then s_fbo_use(fbo_dct_apply1) end
return unpack(ret)
end
s_fbo_use(fbo_dct_apply1)
s_hook_render()
client.fbo_use = s_fbo_use
client.img_dump = s_img_dump
dct_apply_scene()
s_fbo_use(fbo_dct_apply1)
end
end