From 35b7125d87c32532c4e93f0be32f7f99282613a4 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 15 Nov 2020 19:48:37 +0900 Subject: [PATCH] text display adapter --- FontROM7x14.kra | 4 +- FontROM7x14.png | Bin 3874 -> 3888 bytes .../torvald/tsvm/GraphicsJSR223Delegate.kt | 4 +- src/net/torvald/tsvm/VMGUI.kt | 4 +- .../tsvm/peripheral/GraphicsAdapter.kt | 138 ++++++++++++++++-- .../torvald/tsvm/peripheral/TexticsAdapter.kt | 18 ++- src/net/torvald/tsvm/vdc/V2kRunTest.kt | 2 +- tty.png | Bin 24678 -> 33153 bytes 8 files changed, 149 insertions(+), 21 deletions(-) diff --git a/FontROM7x14.kra b/FontROM7x14.kra index e9ca39e..a67f593 100644 --- a/FontROM7x14.kra +++ b/FontROM7x14.kra @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b927d6be493319d3c8d21e69e3e3ca76420f016d3a849fcb199499dcbdcfefb2 -size 99990 +oid sha256:5ea59c01ad818dc10d6b1be4617c95c7b0c420288ff06d62126a4522d6ed066c +size 100464 diff --git a/FontROM7x14.png b/FontROM7x14.png index dd5e7022020ba6ea57874a096a2aebd14a771520..624f632e32bcda35500c9b3b2193622972f30774 100644 GIT binary patch delta 3873 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 Wf&7>srDXsB00{s|MNUMnLSTX@!<&u( diff --git a/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt index f3eb4f5..d96749d 100644 --- a/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt +++ b/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt @@ -41,8 +41,8 @@ class GraphicsJSR223Delegate(val vm: VM) { fun plotPixel(x: Int, y: Int, color: Byte) { getFirstGPU()?.let { - if (x in 0 until GraphicsAdapter.WIDTH && y in 0 until GraphicsAdapter.HEIGHT) { - it.poke(y.toLong() * GraphicsAdapter.WIDTH + x, color) + if (x in 0 until it.config.width && y in 0 until it.config.height) { + it.poke(y.toLong() * it.config.width + x, color) } } } diff --git a/src/net/torvald/tsvm/VMGUI.kt b/src/net/torvald/tsvm/VMGUI.kt index 979092c..597a790 100644 --- a/src/net/torvald/tsvm/VMGUI.kt +++ b/src/net/torvald/tsvm/VMGUI.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.* import net.torvald.tsvm.CompressorDelegate.GZIP_HEADER import net.torvald.tsvm.peripheral.GenericBios import net.torvald.tsvm.peripheral.GraphicsAdapter +import net.torvald.tsvm.peripheral.TexticsAdapter import java.io.File fun ByteArray.startsWith(other: ByteArray) = this.sliceArray(other.indices).contentEquals(other) @@ -31,7 +32,8 @@ class VMGUI(val vm: VM, val appConfig: LwjglApplicationConfiguration) : Applicat override fun create() { super.create() - gpu = GraphicsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) + //gpu = TexticsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) + gpu = GraphicsAdapter(vm, GraphicsAdapter.DEFAULT_CONFIG_COLOR_CRT) vm.peripheralTable[1] = PeripheralEntry( VM.PERITYPE_GPU_AND_TERM, diff --git a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt index 5be14a3..b973d35 100644 --- a/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/GraphicsAdapter.kt @@ -15,12 +15,33 @@ import java.io.InputStream import java.io.OutputStream import kotlin.experimental.and -open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Companion.TEXT_ROWS, Companion.TEXT_COLS), PeriBase { +data class AdapterConfig( + val theme: String, + val width: Int, + val height: Int, + val textCols: Int, + val textRows: Int, + val ttyDefaultFore: Int, + val ttyDefaultBack: Int, + val vramSize: Long, + val chrRomPath: String, + val decay: Float +) + +open class GraphicsAdapter(val vm: VM, val config: AdapterConfig) : + GlassTty(config.textRows, config.textCols), PeriBase { override fun getVM(): VM { return vm } + private val WIDTH = config.width + private val HEIGHT = config.height + private val VRAM_SIZE = config.vramSize + private val TTY_FORE_DEFAULT = config.ttyDefaultFore + private val TTY_BACK_DEFAULT = config.ttyDefaultBack + private val theme = config.theme + internal val framebuffer = Pixmap(WIDTH, HEIGHT, Pixmap.Format.Alpha) protected var rendertex = Texture(1, 1, Pixmap.Format.RGBA8888) internal val paletteOfFloats = FloatArray(1024) { @@ -28,7 +49,7 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan val channel = it % 4 rgba.shr((3 - channel) * 8).and(255) / 255f } - private val chrrom0 = Texture("./FontROM7x14.png") + protected val chrrom0 = Texture(config.chrRomPath) private val faketex: Texture internal val spriteAndTextArea = UnsafeHelper.allocate(10660L) @@ -43,7 +64,9 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan DRAW_SHADER_FRAG ) protected val textShader = AppLoader.loadShaderInline(DRAW_SHADER_VERT, - if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted")) + if (theme.startsWith("crt_") && !theme.endsWith("color")) + TEXT_TILING_SHADER_MONOCHROME + else if (theme.startsWith("pmlcd") && !theme.endsWith("_inverted")) TEXT_TILING_SHADER_LCD_NOINV else if (theme.startsWith("pmlcd")) TEXT_TILING_SHADER_LCD @@ -125,6 +148,10 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan // when in text mode, and that's undesired behaviour // -1 is preferred because it points to the colour CLEAR, and it's constant. spriteAndTextArea.fillWith(-1) + // fill text area with 0 + for (k in 0 until TEXT_ROWS * TEXT_COLS) { + spriteAndTextArea[k + memTextOffset] = 0 + } unusedArea[0] = 2 unusedArea[1] = 3 @@ -539,7 +566,7 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan private var textCursorBlinkTimer = 0f private val textCursorBlinkInterval = 0.5f private var textCursorIsOn = true - private var glowDecay = if (theme.startsWith("pmlcd")) 0.63f else 0.32f + private var glowDecay = config.decay private var decayColor = Color(1f, 1f, 1f, 1f - glowDecay) fun render(delta: Float, batch: SpriteBatch, x: Float, y: Float) { @@ -597,7 +624,7 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan val drawCursor = blinkCursor && textCursorIsOn && cx == x && cy == y val addr = y.toLong() * TEXT_COLS + x val char = - if (drawCursor) 0xDB else spriteAndTextArea[memTextOffset + addr].toInt().and(255) + if (drawCursor) 0xFF else spriteAndTextArea[memTextOffset + addr].toInt().and(255) val back = if (drawCursor) ttyBack else spriteAndTextArea[memTextBackOffset + addr].toInt() .and(255) @@ -732,20 +759,22 @@ open class GraphicsAdapter(val vm: VM, val theme: String = "") : GlassTty(Compan private fun Boolean.toInt() = if (this) 1 else 0 companion object { + val VRAM_SIZE = 256.kB() + + val DEFAULT_CONFIG_COLOR_CRT = AdapterConfig( + "crt_color", + 560, 448, 80, 32, 254, 255, 256.kB(), "./FontROM7x14.png", 0.32f + ) + val DEFAULT_CONFIG_PMLCD = AdapterConfig( + "pmlcd_inverted", + 560, 448, 80, 32, 254, 255, 256.kB(), "./FontROM7x14.png", 0.64f + ) + const val THEME_COLORCRT = "crt_color" const val THEME_GREYCRT = "crt" const val THEME_LCD = "pmlcd" const val THEME_LCD_INVERTED = "pmlcd_inverted" - const val WIDTH = 560 - const val HEIGHT = 448 - const val TEXT_COLS = 80 - const val TEXT_ROWS = 32 - val VRAM_SIZE = 256.kB() - - const val TTY_FORE_DEFAULT = 254 - const val TTY_BACK_DEFAULT = 255 - private val LCD_BASE_COL = Color(0xa1a99cff.toInt()) val DRAW_SHADER_FRAG = """ @@ -911,6 +940,87 @@ void main() { gl_FragColor = backColFromMap; } } +""".trimIndent() + + val TEXT_TILING_SHADER_MONOCHROME = """ +#version 130 +#ifdef GL_ES +precision mediump float; +#endif +#extension GL_EXT_gpu_shader4 : enable + +//layout(origin_upper_left) in vec4 gl_FragCoord; // commented; requires #version 150 or later +// gl_FragCoord is origin to bottom-left + +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + + +uniform vec2 screenDimension; +uniform vec2 tilesInAxes; // size of the tilemap texture; vec2(tiles_in_horizontal, tiles_in_vertical) + +uniform sampler2D tilesAtlas; +uniform sampler2D foreColours; +uniform sampler2D backColours; +uniform sampler2D tilemap; + +uniform vec2 tilesInAtlas = ivec2(16.0, 16.0); +uniform vec2 atlasTexSize = ivec2(128.0, 224.0); +vec2 tileSizeInPx = atlasTexSize / tilesInAtlas; // should be like ivec2(16, 16) + +ivec2 getTileXY(int tileNumber) { + return ivec2(tileNumber % int(tilesInAtlas.x), tileNumber / int(tilesInAtlas.x)); +} + +// return: int=0xaarrggbb +int _colToInt(vec4 color) { + return int(color.b * 255) | (int(color.g * 255) << 8) | (int(color.r * 255) << 16) | (int(color.a * 255) << 24); +} + +// 0x0rggbb where int=0xaarrggbb +// return: [0..1048575] +int getTileFromColor(vec4 color) { + return _colToInt(color) & 0xFFFFF; +} + +void main() { + + // READ THE FUCKING MANUAL, YOU DONKEY !! // + // This code purposedly uses flipped fragcoord. // + // Make sure you don't use gl_FragCoord unknowingly! // + // Remember, if there's a compile error, shader SILENTLY won't do anything // + + + // default gl_FragCoord takes half-integer (represeting centre of the pixel) -- could be useful for phys solver? + // This one, however, takes exact integer by rounding down. // + vec2 flippedFragCoord = vec2(gl_FragCoord.x, screenDimension.y - gl_FragCoord.y); // NO IVEC2!!; this flips Y + + // get required tile numbers // + + vec4 tileFromMap = texture2D(tilemap, flippedFragCoord / screenDimension); // raw tile number + + int tile = getTileFromColor(tileFromMap); + ivec2 tileXY = getTileXY(tile); + + // calculate the UV coord value for texture sampling // + + // don't really need highp here; read the GLES spec + vec2 uvCoordForTile = (mod(flippedFragCoord, tileSizeInPx) / tileSizeInPx) / tilesInAtlas; // 0..0.00390625 regardless of tile position in atlas + vec2 uvCoordOffsetTile = tileXY / tilesInAtlas; // where the tile starts in the atlas, using uv coord (0..1) + + // get final UV coord for the actual sampling // + + vec2 finalUVCoordForTile = uvCoordForTile + uvCoordOffsetTile;// where we should be actually looking for in atlas, using UV coord (0..1) + + // blending a breakage tex with main tex // + + vec4 tileCol = texture2D(tilesAtlas, finalUVCoordForTile); + + // apply colour + gl_FragColor = tileCol; + +} """.trimIndent() val TEXT_TILING_SHADER_LCD = """ diff --git a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt index f8dea5c..e7a0cc6 100644 --- a/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt +++ b/src/net/torvald/tsvm/peripheral/TexticsAdapter.kt @@ -1,8 +1,22 @@ package net.torvald.tsvm.peripheral +import com.badlogic.gdx.graphics.Pixmap +import com.badlogic.gdx.graphics.Texture import net.torvald.tsvm.VM +import net.torvald.tsvm.kB -class TexticsAdapter(vm: VM, theme: String) : GraphicsAdapter(vm, theme) { +class TexticsAdapter(vm: VM, theme: String) : GraphicsAdapter(vm, AdapterConfig( + "crt_green", + 720, + 400, + 80, + 25, + 239, + 0, + 256.kB(), + "./tty.png", + 0.7f +)) { override fun peek(addr: Long): Byte? { return when (addr) { @@ -18,4 +32,6 @@ class TexticsAdapter(vm: VM, theme: String) : GraphicsAdapter(vm, theme) { } } + + } \ No newline at end of file diff --git a/src/net/torvald/tsvm/vdc/V2kRunTest.kt b/src/net/torvald/tsvm/vdc/V2kRunTest.kt index 1ec2c4e..80b6222 100644 --- a/src/net/torvald/tsvm/vdc/V2kRunTest.kt +++ b/src/net/torvald/tsvm/vdc/V2kRunTest.kt @@ -29,7 +29,7 @@ class V2kRunTest(val appConfig: LwjglApplicationConfiguration) : ApplicationAdap override fun create() { super.create() - gpu = GraphicsAdapter(vm, theme = GraphicsAdapter.THEME_COLORCRT) + gpu = GraphicsAdapter(vm, GraphicsAdapter.DEFAULT_CONFIG_COLOR_CRT) vm.peripheralTable[1] = PeripheralEntry( VM.PERITYPE_GPU_AND_TERM, diff --git a/tty.png b/tty.png index e0e42b16a80d1a391c97eb6f9704613a993782be..7e4140c12e7a7ea3c529590fa401796b63eaf5a6 100644 GIT binary patch literal 33153 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 P{X9})@}f1uzXSdctrmRH literal 24678 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