mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-21 14:24:44 +08:00
Added Vulkan support for palettized textures
This commit is contained in:
@@ -181,6 +181,12 @@ static const float TONEMAP_NONE = 0;
|
||||
//static const float TONEMAP_LINEAR = 1;
|
||||
static const float TONEMAP_CHROME = 2;
|
||||
|
||||
//static const float TEXTURETYPE_NONE = 0;
|
||||
static const float TEXTURETYPE_RGB = 1;
|
||||
static const float TEXTURETYPE_RGB_PIXELART = 2;
|
||||
static const float TEXTURETYPE_PALETTE = 3;
|
||||
static const float TEXTURETYPE_PALETTE_PIXELART = 4;
|
||||
|
||||
static const float INPUTTYPE_UNSPECIFIED = 0;
|
||||
static const float INPUTTYPE_SRGB = 1;
|
||||
static const float INPUTTYPE_SCRGB = 2;
|
||||
@@ -190,9 +196,9 @@ static const float INPUTTYPE_HDR10 = 3;
|
||||
typedef struct
|
||||
{
|
||||
float scRGB_output;
|
||||
float texture_type;
|
||||
float input_type;
|
||||
float color_scale;
|
||||
float pixel_art;
|
||||
|
||||
float texel_width;
|
||||
float texel_height;
|
||||
@@ -238,6 +244,7 @@ typedef struct
|
||||
typedef struct
|
||||
{
|
||||
VULKAN_Image mainImage;
|
||||
VULKAN_Image paletteImage;
|
||||
VkRenderPass mainRenderpasses[VULKAN_RENDERPASS_COUNT];
|
||||
VkFramebuffer mainFramebuffer;
|
||||
VULKAN_Buffer stagingBuffer;
|
||||
@@ -447,6 +454,8 @@ static VkFormat SDLPixelFormatToVkTextureFormat(Uint32 format, Uint32 output_col
|
||||
return VK_FORMAT_R8G8B8A8_SRGB;
|
||||
}
|
||||
return VK_FORMAT_R8G8B8A8_UNORM;
|
||||
case SDL_PIXELFORMAT_INDEX8:
|
||||
return VK_FORMAT_R8_UNORM;
|
||||
case SDL_PIXELFORMAT_YUY2:
|
||||
return VK_FORMAT_G8B8G8R8_422_UNORM;
|
||||
case SDL_PIXELFORMAT_UYVY:
|
||||
@@ -2685,6 +2694,21 @@ static bool VULKAN_CreateTexture(SDL_Renderer *renderer, SDL_Texture *texture, S
|
||||
return false;
|
||||
}
|
||||
|
||||
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
|
||||
VkFormat paletteFormat;
|
||||
|
||||
if (renderer->output_colorspace == SDL_COLORSPACE_SRGB_LINEAR) {
|
||||
paletteFormat = VK_FORMAT_R8G8B8A8_SRGB;
|
||||
} else {
|
||||
paletteFormat = VK_FORMAT_R8G8B8A8_UNORM;
|
||||
}
|
||||
result = VULKAN_AllocateImage(rendererData, 0, 256, 1, paletteFormat, usage, imageViewSwizzle, textureData->samplerYcbcrConversion, &textureData->paletteImage);
|
||||
if (result != VK_SUCCESS) {
|
||||
SET_ERROR_CODE("VULKAN_AllocateImage()", result);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_PropertiesID props = SDL_GetTextureProperties(texture);
|
||||
SDL_SetNumberProperty(props, SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER, (Sint64)textureData->mainImage.image);
|
||||
|
||||
@@ -2722,6 +2746,10 @@ static void VULKAN_DestroyTexture(SDL_Renderer *renderer,
|
||||
|
||||
VULKAN_DestroyImage(rendererData, &textureData->mainImage);
|
||||
|
||||
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
|
||||
VULKAN_DestroyImage(rendererData, &textureData->paletteImage);
|
||||
}
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
if (textureData->samplerYcbcrConversion != VK_NULL_HANDLE) {
|
||||
vkDestroySamplerYcbcrConversionKHR(rendererData->device, textureData->samplerYcbcrConversion, NULL);
|
||||
@@ -2849,6 +2877,19 @@ static bool VULKAN_UpdateTextureInternal(VULKAN_RenderData *rendererData, VkImag
|
||||
}
|
||||
|
||||
|
||||
static bool VULKAN_UpdateTexturePalette(SDL_Renderer *renderer, SDL_Texture *texture)
|
||||
{
|
||||
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
|
||||
VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
|
||||
SDL_Palette *palette = texture->palette;
|
||||
|
||||
if (!textureData) {
|
||||
return SDL_SetError("Texture is not currently available");
|
||||
}
|
||||
|
||||
return VULKAN_UpdateTextureInternal(rendererData, textureData->paletteImage.image, textureData->paletteImage.format, 0, 0, 0, palette->ncolors, 1, palette->colors, palette->ncolors * sizeof(*palette->colors), &textureData->paletteImage.imageLayout);
|
||||
}
|
||||
|
||||
static bool VULKAN_UpdateTexture(SDL_Renderer *renderer, SDL_Texture *texture,
|
||||
const SDL_Rect *rect, const void *srcPixels,
|
||||
int srcPitch)
|
||||
@@ -3369,8 +3410,21 @@ static void VULKAN_SetupShaderConstants(SDL_Renderer *renderer, const SDL_Render
|
||||
break;
|
||||
}
|
||||
|
||||
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
|
||||
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
|
||||
constants->texture_type = TEXTURETYPE_PALETTE_PIXELART;
|
||||
} else {
|
||||
constants->texture_type = TEXTURETYPE_PALETTE;
|
||||
}
|
||||
} else {
|
||||
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
|
||||
constants->texture_type = TEXTURETYPE_RGB_PIXELART;
|
||||
} else {
|
||||
constants->texture_type = TEXTURETYPE_RGB;
|
||||
}
|
||||
}
|
||||
|
||||
if (cmd->data.draw.texture_scale_mode == SDL_SCALEMODE_PIXELART) {
|
||||
constants->pixel_art = 1.0f;
|
||||
constants->texture_width = texture->w;
|
||||
constants->texture_height = texture->h;
|
||||
constants->texel_width = 1.0f / constants->texture_width;
|
||||
@@ -3399,7 +3453,7 @@ static VULKAN_Shader SelectShader(const VULKAN_PixelShaderConstants *shader_cons
|
||||
return SHADER_SOLID;
|
||||
}
|
||||
|
||||
if (shader_constants->pixel_art == 0.0f &&
|
||||
if (shader_constants->texture_type == TEXTURETYPE_RGB &&
|
||||
shader_constants->input_type == INPUTTYPE_UNSPECIFIED &&
|
||||
shader_constants->tonemap_method == TONEMAP_NONE) {
|
||||
return SHADER_RGB;
|
||||
@@ -3445,22 +3499,29 @@ static VkResult VULKAN_CreateDescriptorSetAndPipelineLayout(VULKAN_RenderData *r
|
||||
VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo = { 0 };
|
||||
descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
|
||||
descriptorSetLayoutCreateInfo.flags = 0;
|
||||
VkDescriptorSetLayoutBinding layoutBindings[2];
|
||||
VkDescriptorSetLayoutBinding layoutBindings[3];
|
||||
// PixelShaderConstants
|
||||
layoutBindings[0].binding = 1;
|
||||
layoutBindings[0].binding = 0;
|
||||
layoutBindings[0].descriptorCount = 1;
|
||||
layoutBindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
layoutBindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
layoutBindings[0].pImmutableSamplers = NULL;
|
||||
|
||||
// Combined image/sampler
|
||||
layoutBindings[1].binding = 0;
|
||||
layoutBindings[1].binding = 1;
|
||||
layoutBindings[1].descriptorCount = 1;
|
||||
layoutBindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
layoutBindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
layoutBindings[1].pImmutableSamplers = (samplerYcbcr != VK_NULL_HANDLE) ? &samplerYcbcr : NULL;
|
||||
|
||||
descriptorSetLayoutCreateInfo.bindingCount = 2;
|
||||
// Combined image/sampler
|
||||
layoutBindings[2].binding = 2;
|
||||
layoutBindings[2].descriptorCount = 1;
|
||||
layoutBindings[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
layoutBindings[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
|
||||
layoutBindings[2].pImmutableSamplers = (samplerYcbcr != VK_NULL_HANDLE) ? &samplerYcbcr : NULL;
|
||||
|
||||
descriptorSetLayoutCreateInfo.bindingCount = 3;
|
||||
descriptorSetLayoutCreateInfo.pBindings = layoutBindings;
|
||||
result = vkCreateDescriptorSetLayout(rendererData->device, &descriptorSetLayoutCreateInfo, NULL, descriptorSetLayoutOut);
|
||||
if (result != VK_SUCCESS) {
|
||||
@@ -3489,7 +3550,7 @@ static VkResult VULKAN_CreateDescriptorSetAndPipelineLayout(VULKAN_RenderData *r
|
||||
}
|
||||
|
||||
static VkDescriptorSet VULKAN_AllocateDescriptorSet(SDL_Renderer *renderer, VULKAN_Shader shader, VkDescriptorSetLayout descriptorSetLayout,
|
||||
VkSampler sampler, VkBuffer constantBuffer, VkDeviceSize constantBufferOffset, VkImageView imageView)
|
||||
VkBuffer constantBuffer, VkDeviceSize constantBufferOffset, int numImages, VkImageView *imageViews, int numSamplers, VkSampler *samplers)
|
||||
{
|
||||
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
|
||||
uint32_t currentDescriptorPoolIndex = rendererData->currentDescriptorPoolIndex;
|
||||
@@ -3538,44 +3599,50 @@ static VkDescriptorSet VULKAN_AllocateDescriptorSet(SDL_Renderer *renderer, VULK
|
||||
rendererData->currentDescriptorSetIndex = 0;
|
||||
|
||||
// Call recursively to allocate from the new pool
|
||||
return VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, sampler, constantBuffer, constantBufferOffset, imageView);
|
||||
return VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, constantBuffer, constantBufferOffset, numImages, imageViews, numSamplers, samplers);
|
||||
}
|
||||
}
|
||||
rendererData->currentDescriptorSetIndex++;
|
||||
VkDescriptorImageInfo combinedImageSamplerDescriptor = { 0 };
|
||||
VkDescriptorImageInfo combinedImageSamplerDescriptor[2];
|
||||
VkDescriptorBufferInfo bufferDescriptor = { 0 };
|
||||
bufferDescriptor.buffer = constantBuffer;
|
||||
bufferDescriptor.offset = constantBufferOffset;
|
||||
bufferDescriptor.range = sizeof(VULKAN_PixelShaderConstants);
|
||||
|
||||
VkWriteDescriptorSet descriptorWrites[2];
|
||||
SDL_memset(descriptorWrites, 0, sizeof(descriptorWrites));
|
||||
VkWriteDescriptorSet descriptorWrites[3];
|
||||
SDL_zero(descriptorWrites);
|
||||
uint32_t descriptorCount = 1; // Always have the uniform buffer
|
||||
|
||||
descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptorWrites[0].dstSet = descriptorSet;
|
||||
descriptorWrites[0].dstBinding = 1;
|
||||
descriptorWrites[0].dstBinding = 0;
|
||||
descriptorWrites[0].dstArrayElement = 0;
|
||||
descriptorWrites[0].descriptorCount = 1;
|
||||
descriptorWrites[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
descriptorWrites[0].pBufferInfo = &bufferDescriptor;
|
||||
|
||||
if (sampler != VK_NULL_HANDLE && imageView != VK_NULL_HANDLE) {
|
||||
descriptorCount++;
|
||||
descriptorWrites[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
descriptorWrites[1].dstSet = descriptorSet;
|
||||
descriptorWrites[1].dstBinding = 0;
|
||||
descriptorWrites[1].dstArrayElement = 0;
|
||||
descriptorWrites[1].descriptorCount = 1;
|
||||
descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
descriptorWrites[1].pImageInfo = &combinedImageSamplerDescriptor;
|
||||
|
||||
// Ignore the sampler if we're using YcBcCr data since it will be baked in the descriptor set layout
|
||||
SDL_assert(numSamplers == numImages);
|
||||
for (int i = 0; i < numImages; ++i) {
|
||||
SDL_assert(i < SDL_arraysize(combinedImageSamplerDescriptor));
|
||||
VkDescriptorImageInfo *pImageInfo = &combinedImageSamplerDescriptor[i];
|
||||
SDL_zerop(pImageInfo);
|
||||
if (descriptorSetLayout == rendererData->descriptorSetLayout) {
|
||||
combinedImageSamplerDescriptor.sampler = sampler;
|
||||
pImageInfo->sampler = samplers[i];
|
||||
} else {
|
||||
// Ignore the sampler if we're using YcBcCr data since it will be baked in the descriptor set layout
|
||||
}
|
||||
combinedImageSamplerDescriptor.imageView = imageView;
|
||||
combinedImageSamplerDescriptor.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
pImageInfo->imageView = imageViews[i];
|
||||
pImageInfo->imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
|
||||
SDL_assert(descriptorCount < SDL_arraysize(descriptorWrites));
|
||||
VkWriteDescriptorSet *pDescriptorSet = &descriptorWrites[descriptorCount++];
|
||||
pDescriptorSet->sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
pDescriptorSet->dstSet = descriptorSet;
|
||||
pDescriptorSet->dstBinding = 1 + i;
|
||||
pDescriptorSet->dstArrayElement = 0;
|
||||
pDescriptorSet->descriptorCount = 1;
|
||||
pDescriptorSet->descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
pDescriptorSet->pImageInfo = pImageInfo;
|
||||
}
|
||||
|
||||
vkUpdateDescriptorSets(rendererData->device, descriptorCount, descriptorWrites, 0, NULL);
|
||||
@@ -3584,7 +3651,7 @@ static VkDescriptorSet VULKAN_AllocateDescriptorSet(SDL_Renderer *renderer, VULK
|
||||
}
|
||||
|
||||
static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand *cmd, VkPipelineLayout pipelineLayout, VkDescriptorSetLayout descriptorSetLayout,
|
||||
const VULKAN_PixelShaderConstants *shader_constants, VkPrimitiveTopology topology, VkImageView imageView, VkSampler sampler, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
|
||||
const VULKAN_PixelShaderConstants *shader_constants, VkPrimitiveTopology topology, int numImages, VkImageView *imageViews, int numSamplers, VkSampler *samplers, const Float4X4 *matrix, VULKAN_DrawStateCache *stateCache)
|
||||
|
||||
{
|
||||
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
|
||||
@@ -3718,7 +3785,7 @@ static bool VULKAN_SetDrawState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
}
|
||||
|
||||
// Allocate/update descriptor set with the bindings
|
||||
descriptorSet = VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, sampler, constantBuffer, constantBufferOffset, imageView);
|
||||
descriptorSet = VULKAN_AllocateDescriptorSet(renderer, shader, descriptorSetLayout, constantBuffer, constantBufferOffset, numImages, imageViews, numSamplers, samplers);
|
||||
if (descriptorSet == VK_NULL_HANDLE) {
|
||||
return false;
|
||||
}
|
||||
@@ -3794,18 +3861,16 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
SDL_Texture *texture = cmd->data.draw.texture;
|
||||
VULKAN_RenderData *rendererData = (VULKAN_RenderData *)renderer->internal;
|
||||
VULKAN_TextureData *textureData = (VULKAN_TextureData *)texture->internal;
|
||||
VkSampler textureSampler = VK_NULL_HANDLE;
|
||||
int numImageViews = 0;
|
||||
VkImageView imageViews[2];
|
||||
int numSamplers = 0;
|
||||
VkSampler samplers[2];
|
||||
VULKAN_PixelShaderConstants constants;
|
||||
VkDescriptorSetLayout descriptorSetLayout = (textureData->descriptorSetLayoutYcbcr != VK_NULL_HANDLE) ? textureData->descriptorSetLayoutYcbcr : rendererData->descriptorSetLayout;
|
||||
VkPipelineLayout pipelineLayout = (textureData->pipelineLayoutYcbcr != VK_NULL_HANDLE) ? textureData->pipelineLayoutYcbcr : rendererData->pipelineLayout;
|
||||
|
||||
VULKAN_SetupShaderConstants(renderer, cmd, texture, &constants);
|
||||
|
||||
textureSampler = VULKAN_GetSampler(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
|
||||
if (textureSampler == VK_NULL_HANDLE) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (textureData->mainImage.imageLayout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
|
||||
bool stoppedRenderPass = false;
|
||||
if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
|
||||
@@ -3827,8 +3892,50 @@ static bool VULKAN_SetCopyState(SDL_Renderer *renderer, const SDL_RenderCommand
|
||||
VULKAN_BeginRenderPass(rendererData, VK_ATTACHMENT_LOAD_OP_LOAD, NULL);
|
||||
}
|
||||
}
|
||||
imageViews[numImageViews++] = textureData->mainImage.imageView;
|
||||
|
||||
return VULKAN_SetDrawState(renderer, cmd, pipelineLayout, descriptorSetLayout, &constants, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, textureData->mainImage.imageView, textureSampler, matrix, stateCache);
|
||||
samplers[numSamplers] = VULKAN_GetSampler(rendererData, cmd->data.draw.texture_scale_mode, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v);
|
||||
if (samplers[numSamplers] == VK_NULL_HANDLE) {
|
||||
return false;
|
||||
}
|
||||
++numSamplers;
|
||||
|
||||
if (texture->format == SDL_PIXELFORMAT_INDEX8) {
|
||||
if (textureData->paletteImage.imageLayout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
|
||||
bool stoppedRenderPass = false;
|
||||
if (rendererData->currentRenderPass != VK_NULL_HANDLE) {
|
||||
vkCmdEndRenderPass(rendererData->currentCommandBuffer);
|
||||
rendererData->currentRenderPass = VK_NULL_HANDLE;
|
||||
stoppedRenderPass = true;
|
||||
}
|
||||
|
||||
VULKAN_RecordPipelineImageBarrier(rendererData,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
|
||||
VK_ACCESS_SHADER_READ_BIT,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT | VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT | VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
|
||||
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
textureData->paletteImage.image,
|
||||
&textureData->paletteImage.imageLayout);
|
||||
|
||||
if (stoppedRenderPass) {
|
||||
VULKAN_BeginRenderPass(rendererData, VK_ATTACHMENT_LOAD_OP_LOAD, NULL);
|
||||
}
|
||||
}
|
||||
imageViews[numImageViews++] = textureData->paletteImage.imageView;
|
||||
|
||||
samplers[numSamplers] = VULKAN_GetSampler(rendererData, SDL_SCALEMODE_NEAREST, SDL_TEXTURE_ADDRESS_CLAMP, SDL_TEXTURE_ADDRESS_CLAMP);
|
||||
if (samplers[numSamplers] == VK_NULL_HANDLE) {
|
||||
return false;
|
||||
}
|
||||
++numSamplers;
|
||||
} else {
|
||||
// We need a valid image view and sampler, but we know we're not going to reference them in the shader
|
||||
imageViews[numImageViews++] = imageViews[0];
|
||||
samplers[numSamplers++] = samplers[0];
|
||||
}
|
||||
|
||||
return VULKAN_SetDrawState(renderer, cmd, pipelineLayout, descriptorSetLayout, &constants, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, numImageViews, imageViews, numSamplers, samplers, matrix, stateCache);
|
||||
}
|
||||
|
||||
static void VULKAN_DrawPrimitives(SDL_Renderer *renderer, VkPrimitiveTopology primitiveTopology, const size_t vertexStart, const size_t vertexCount)
|
||||
@@ -3929,7 +4036,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
||||
const size_t count = cmd->data.draw.count;
|
||||
const size_t first = cmd->data.draw.first;
|
||||
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, 0, NULL, 0, NULL, NULL, &stateCache);
|
||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start, count);
|
||||
break;
|
||||
}
|
||||
@@ -3940,10 +4047,10 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
||||
const size_t first = cmd->data.draw.first;
|
||||
const size_t start = first / sizeof(VULKAN_VertexPositionColor);
|
||||
const VULKAN_VertexPositionColor *verts = (VULKAN_VertexPositionColor *)(((Uint8 *)vertices) + first);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, 0, NULL, 0, NULL, NULL, &stateCache);
|
||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, start, count);
|
||||
if (verts[0].pos[0] != verts[count - 1].pos[0] || verts[0].pos[1] != verts[count - 1].pos[1]) {
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, 0, NULL, 0, NULL, NULL, &stateCache);
|
||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_POINT_LIST, start + (count - 1), 1);
|
||||
}
|
||||
break;
|
||||
@@ -3968,7 +4075,7 @@ static bool VULKAN_RunCommandQueue(SDL_Renderer *renderer, SDL_RenderCommand *cm
|
||||
if (texture) {
|
||||
VULKAN_SetCopyState(renderer, cmd, NULL, &stateCache);
|
||||
} else {
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, VK_NULL_HANDLE, VK_NULL_HANDLE, NULL, &stateCache);
|
||||
VULKAN_SetDrawState(renderer, cmd, rendererData->pipelineLayout, rendererData->descriptorSetLayout, NULL, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 0, NULL, 0, NULL, NULL, &stateCache);
|
||||
}
|
||||
|
||||
VULKAN_DrawPrimitives(renderer, VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, start, count);
|
||||
@@ -4285,6 +4392,7 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD
|
||||
renderer->WindowEvent = VULKAN_WindowEvent;
|
||||
renderer->SupportsBlendMode = VULKAN_SupportsBlendMode;
|
||||
renderer->CreateTexture = VULKAN_CreateTexture;
|
||||
renderer->UpdateTexturePalette = VULKAN_UpdateTexturePalette;
|
||||
renderer->UpdateTexture = VULKAN_UpdateTexture;
|
||||
#ifdef SDL_HAVE_YUV
|
||||
renderer->UpdateTextureYUV = VULKAN_UpdateTextureYUV;
|
||||
@@ -4314,6 +4422,7 @@ static bool VULKAN_CreateRenderer(SDL_Renderer *renderer, SDL_Window *window, SD
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR8888);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_ABGR2101010);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_RGBA64_FLOAT);
|
||||
SDL_AddSupportedTextureFormat(renderer, SDL_PIXELFORMAT_INDEX8);
|
||||
SDL_SetNumberProperty(SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER, 16384);
|
||||
|
||||
/* HACK: make sure the SDL_Renderer references the SDL_Window data now, in
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,43 +1,43 @@
|
||||
// 1115.0.0
|
||||
#pragma once
|
||||
static const uint32_t VULKAN_PixelShader_Colors[] = {
|
||||
0x07230203,0x00010000,0x0008000b,0x000000a1,0x00000000,0x00020011,0x00000001,0x0006000b,
|
||||
0x07230203,0x00010000,0x0008000b,0x000000a4,0x00000000,0x00020011,0x00000001,0x0006000b,
|
||||
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
|
||||
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000048,0x0000004c,0x00030010,
|
||||
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000049,0x0000004d,0x00030010,
|
||||
0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,0x6e69616d,
|
||||
0x00000000,0x00050005,0x00000018,0x736e6f43,0x746e6174,0x00000073,0x00070006,0x00000018,
|
||||
0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00060006,0x00000018,0x00000001,
|
||||
0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000018,0x00000002,0x6f6c6f63,0x63735f72,
|
||||
0x00656c61,0x00060006,0x00000018,0x00000003,0x65786970,0x72615f6c,0x00000074,0x00060006,
|
||||
0x00000018,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,0x00000018,0x00000005,
|
||||
0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000018,0x00000006,0x656e6f74,
|
||||
0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,0x00000007,0x656e6f74,0x5f70616d,
|
||||
0x74636166,0x0032726f,0x00070006,0x00000018,0x00000008,0x5f726473,0x74696877,0x6f705f65,
|
||||
0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,0x00000048,0x75706e69,0x6f632e74,
|
||||
0x00726f6c,0x00070005,0x0000004c,0x746e6540,0x6f507972,0x4f746e69,0x75707475,0x00000074,
|
||||
0x00030047,0x00000018,0x00000002,0x00050048,0x00000018,0x00000000,0x00000023,0x00000000,
|
||||
0x00050048,0x00000018,0x00000001,0x00000023,0x00000004,0x00050048,0x00000018,0x00000002,
|
||||
0x00000023,0x00000008,0x00050048,0x00000018,0x00000003,0x00000023,0x0000000c,0x00050048,
|
||||
0x00000018,0x00000004,0x00000023,0x00000010,0x00050048,0x00000018,0x00000005,0x00000023,
|
||||
0x00000020,0x00050048,0x00000018,0x00000006,0x00000023,0x00000024,0x00050048,0x00000018,
|
||||
0x00000007,0x00000023,0x00000028,0x00050048,0x00000018,0x00000008,0x00000023,0x0000002c,
|
||||
0x00040047,0x0000001a,0x00000021,0x00000001,0x00040047,0x0000001a,0x00000022,0x00000000,
|
||||
0x00040047,0x00000048,0x0000001e,0x00000001,0x00040047,0x0000004c,0x0000001e,0x00000000,
|
||||
0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,
|
||||
0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,0x00000015,0x00000006,0x00000003,
|
||||
0x000b001e,0x00000018,0x00000006,0x00000006,0x00000006,0x00000006,0x00000007,0x00000006,
|
||||
0x00000006,0x00000006,0x00000006,0x00040020,0x00000019,0x00000002,0x00000018,0x0004003b,
|
||||
0x00000019,0x0000001a,0x00000002,0x00040015,0x0000001b,0x00000020,0x00000001,0x0004002b,
|
||||
0x0000001b,0x0000001c,0x00000002,0x00040020,0x0000001d,0x00000002,0x00000006,0x0004002b,
|
||||
0x00000006,0x00000033,0x3f800000,0x00040020,0x0000003e,0x00000001,0x00000007,0x0004003b,
|
||||
0x0000003e,0x00000048,0x00000001,0x00040020,0x0000004b,0x00000003,0x00000007,0x0004003b,
|
||||
0x0000004b,0x0000004c,0x00000003,0x0006002c,0x00000015,0x0000009f,0x00000033,0x00000033,
|
||||
0x00000033,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,
|
||||
0x0004003d,0x00000007,0x00000049,0x00000048,0x00050041,0x0000001d,0x0000007e,0x0000001a,
|
||||
0x0000001c,0x0004003d,0x00000006,0x0000007f,0x0000007e,0x0005008e,0x00000015,0x00000080,
|
||||
0x0000009f,0x0000007f,0x00050051,0x00000006,0x00000082,0x00000080,0x00000000,0x00050051,
|
||||
0x00000006,0x00000084,0x00000080,0x00000001,0x00050051,0x00000006,0x00000086,0x00000080,
|
||||
0x00000002,0x00070050,0x00000007,0x000000a0,0x00000082,0x00000084,0x00000086,0x00000033,
|
||||
0x00050085,0x00000007,0x00000078,0x000000a0,0x00000049,0x0003003e,0x0000004c,0x00000078,
|
||||
0x000100fd,0x00010038
|
||||
0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00070006,0x00000018,0x00000001,
|
||||
0x74786574,0x5f657275,0x65707974,0x00000000,0x00060006,0x00000018,0x00000002,0x75706e69,
|
||||
0x79745f74,0x00006570,0x00060006,0x00000018,0x00000003,0x6f6c6f63,0x63735f72,0x00656c61,
|
||||
0x00060006,0x00000018,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,0x00000018,
|
||||
0x00000005,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000018,0x00000006,
|
||||
0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,0x00000007,0x656e6f74,
|
||||
0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000018,0x00000008,0x5f726473,0x74696877,
|
||||
0x6f705f65,0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,0x00000049,0x75706e69,
|
||||
0x6f632e74,0x00726f6c,0x00070005,0x0000004d,0x746e6540,0x6f507972,0x4f746e69,0x75707475,
|
||||
0x00000074,0x00030047,0x00000018,0x00000002,0x00050048,0x00000018,0x00000000,0x00000023,
|
||||
0x00000000,0x00050048,0x00000018,0x00000001,0x00000023,0x00000004,0x00050048,0x00000018,
|
||||
0x00000002,0x00000023,0x00000008,0x00050048,0x00000018,0x00000003,0x00000023,0x0000000c,
|
||||
0x00050048,0x00000018,0x00000004,0x00000023,0x00000010,0x00050048,0x00000018,0x00000005,
|
||||
0x00000023,0x00000020,0x00050048,0x00000018,0x00000006,0x00000023,0x00000024,0x00050048,
|
||||
0x00000018,0x00000007,0x00000023,0x00000028,0x00050048,0x00000018,0x00000008,0x00000023,
|
||||
0x0000002c,0x00040047,0x0000001a,0x00000021,0x00000000,0x00040047,0x0000001a,0x00000022,
|
||||
0x00000000,0x00040047,0x00000049,0x0000001e,0x00000001,0x00040047,0x0000004d,0x0000001e,
|
||||
0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,
|
||||
0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,0x00000015,0x00000006,
|
||||
0x00000003,0x000b001e,0x00000018,0x00000006,0x00000006,0x00000006,0x00000006,0x00000007,
|
||||
0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000019,0x00000002,0x00000018,
|
||||
0x0004003b,0x00000019,0x0000001a,0x00000002,0x00040015,0x0000001b,0x00000020,0x00000001,
|
||||
0x0004002b,0x0000001b,0x0000001c,0x00000003,0x00040020,0x0000001d,0x00000002,0x00000006,
|
||||
0x0004002b,0x00000006,0x00000033,0x3f800000,0x00040020,0x0000003f,0x00000001,0x00000007,
|
||||
0x0004003b,0x0000003f,0x00000049,0x00000001,0x00040020,0x0000004c,0x00000003,0x00000007,
|
||||
0x0004003b,0x0000004c,0x0000004d,0x00000003,0x0006002c,0x00000015,0x000000a2,0x00000033,
|
||||
0x00000033,0x00000033,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
|
||||
0x00000005,0x0004003d,0x00000007,0x0000004a,0x00000049,0x00050041,0x0000001d,0x00000081,
|
||||
0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000082,0x00000081,0x0005008e,0x00000015,
|
||||
0x00000083,0x000000a2,0x00000082,0x00050051,0x00000006,0x00000085,0x00000083,0x00000000,
|
||||
0x00050051,0x00000006,0x00000087,0x00000083,0x00000001,0x00050051,0x00000006,0x00000089,
|
||||
0x00000083,0x00000002,0x00070050,0x00000007,0x000000a3,0x00000085,0x00000087,0x00000089,
|
||||
0x00000033,0x00050085,0x00000007,0x0000007b,0x000000a3,0x0000004a,0x0003003e,0x0000004d,
|
||||
0x0000007b,0x000100fd,0x00010038
|
||||
};
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
|
||||
layout (set = 0, binding = 1) Texture2D texture0 : register(t0);
|
||||
layout (set = 0, binding = 2) Texture2D texture1 : register(t1);
|
||||
SamplerState sampler0 : register(s0);
|
||||
Texture2D texture0 : register(t0);
|
||||
SamplerState sampler1 : register(s1);
|
||||
|
||||
struct PixelShaderInput
|
||||
{
|
||||
@@ -13,17 +16,23 @@ static const float TONEMAP_NONE = 0;
|
||||
static const float TONEMAP_LINEAR = 1;
|
||||
static const float TONEMAP_CHROME = 2;
|
||||
|
||||
static const float TEXTURETYPE_NONE = 0;
|
||||
static const float TEXTURETYPE_RGB = 1;
|
||||
static const float TEXTURETYPE_RGB_PIXELART = 2;
|
||||
static const float TEXTURETYPE_PALETTE = 3;
|
||||
static const float TEXTURETYPE_PALETTE_PIXELART = 4;
|
||||
|
||||
static const float INPUTTYPE_UNSPECIFIED = 0;
|
||||
static const float INPUTTYPE_SRGB = 1;
|
||||
static const float INPUTTYPE_SCRGB = 2;
|
||||
static const float INPUTTYPE_HDR10 = 3;
|
||||
|
||||
cbuffer Constants : register(b1)
|
||||
layout (set = 0, binding = 0) cbuffer Constants : register(b1)
|
||||
{
|
||||
float scRGB_output;
|
||||
float texture_type;
|
||||
float input_type;
|
||||
float color_scale;
|
||||
float pixel_art;
|
||||
float4 texel_size;
|
||||
|
||||
float tonemap_method;
|
||||
@@ -101,29 +110,46 @@ float3 ApplyTonemap(float3 v)
|
||||
return v;
|
||||
}
|
||||
|
||||
float2 GetPixelArtUV(PixelShaderInput input)
|
||||
{
|
||||
// box filter size in texel units
|
||||
float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
|
||||
|
||||
// scale uv by texture size to get texel coordinate
|
||||
float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
|
||||
|
||||
// compute offset for pixel-sized box filter
|
||||
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
|
||||
|
||||
// compute bilinear sample uv coordinates
|
||||
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
|
||||
|
||||
return uv;
|
||||
}
|
||||
|
||||
float4 GetInputColor(PixelShaderInput input)
|
||||
{
|
||||
float4 rgba;
|
||||
|
||||
if (pixel_art) {
|
||||
// box filter size in texel units
|
||||
float2 boxSize = clamp(fwidth(input.tex) * texel_size.zw, 1e-5, 1);
|
||||
|
||||
// scale uv by texture size to get texel coordinate
|
||||
float2 tx = input.tex * texel_size.zw - 0.5 * boxSize;
|
||||
|
||||
// compute offset for pixel-sized box filter
|
||||
float2 txOffset = smoothstep(1 - boxSize, 1, frac(tx));
|
||||
|
||||
// compute bilinear sample uv coordinates
|
||||
float2 uv = (floor(tx) + 0.5 + txOffset) * texel_size.xy;
|
||||
|
||||
// sample the texture
|
||||
if (texture_type == TEXTURETYPE_RGB) {
|
||||
rgba = texture0.Sample(sampler0, input.tex);
|
||||
} else if (texture_type == TEXTURETYPE_RGB_PIXELART) {
|
||||
float2 uv = GetPixelArtUV(input);
|
||||
rgba = texture0.SampleGrad(sampler0, uv, ddx(input.tex), ddy(input.tex));
|
||||
} else if (texture_type == TEXTURETYPE_PALETTE) {
|
||||
float index = texture0.Sample(sampler0, input.tex).r * 255;
|
||||
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
|
||||
} else if (texture_type == TEXTURETYPE_PALETTE_PIXELART) {
|
||||
float2 uv = GetPixelArtUV(input);
|
||||
float index = texture0.Sample(sampler0, uv).r * 255;
|
||||
rgba = texture1.Sample(sampler1, float2((index + 0.5) / 256, 0.5));
|
||||
} else {
|
||||
rgba = texture0.Sample(sampler0, input.tex).rgba;
|
||||
// Error!
|
||||
rgba.r = 1.0;
|
||||
rgba.g = 0.0;
|
||||
rgba.b = 0.0;
|
||||
rgba.a = 1.0;
|
||||
}
|
||||
|
||||
return rgba;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,52 +1,52 @@
|
||||
// 1115.0.0
|
||||
#pragma once
|
||||
static const uint32_t VULKAN_PixelShader_Textures[] = {
|
||||
0x07230203,0x00010000,0x0008000b,0x000000a8,0x00000000,0x00020011,0x00000001,0x0006000b,
|
||||
0x07230203,0x00010000,0x0008000b,0x000000ab,0x00000000,0x00020011,0x00000001,0x0006000b,
|
||||
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
|
||||
0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000004b,0x0000004e,0x00000052,
|
||||
0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000004c,0x0000004f,0x00000053,
|
||||
0x00030010,0x00000004,0x00000007,0x00030003,0x00000005,0x000001f4,0x00040005,0x00000004,
|
||||
0x6e69616d,0x00000000,0x00050005,0x00000018,0x736e6f43,0x746e6174,0x00000073,0x00070006,
|
||||
0x00000018,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00060006,0x00000018,
|
||||
0x00000001,0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000018,0x00000002,0x6f6c6f63,
|
||||
0x63735f72,0x00656c61,0x00060006,0x00000018,0x00000003,0x65786970,0x72615f6c,0x00000074,
|
||||
0x00060006,0x00000018,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,0x00000018,
|
||||
0x00000005,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000018,0x00000006,
|
||||
0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,0x00000007,0x656e6f74,
|
||||
0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000018,0x00000008,0x5f726473,0x74696877,
|
||||
0x6f705f65,0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,0x00000036,0x74786574,
|
||||
0x30657275,0x00000000,0x00050005,0x0000004b,0x75706e69,0x65742e74,0x00000078,0x00050005,
|
||||
0x0000004e,0x75706e69,0x6f632e74,0x00726f6c,0x00070005,0x00000052,0x746e6540,0x6f507972,
|
||||
0x4f746e69,0x75707475,0x00000074,0x00030047,0x00000018,0x00000002,0x00050048,0x00000018,
|
||||
0x00000000,0x00000023,0x00000000,0x00050048,0x00000018,0x00000001,0x00000023,0x00000004,
|
||||
0x00050048,0x00000018,0x00000002,0x00000023,0x00000008,0x00050048,0x00000018,0x00000003,
|
||||
0x00000023,0x0000000c,0x00050048,0x00000018,0x00000004,0x00000023,0x00000010,0x00050048,
|
||||
0x00000018,0x00000005,0x00000023,0x00000020,0x00050048,0x00000018,0x00000006,0x00000023,
|
||||
0x00000024,0x00050048,0x00000018,0x00000007,0x00000023,0x00000028,0x00050048,0x00000018,
|
||||
0x00000008,0x00000023,0x0000002c,0x00040047,0x0000001a,0x00000021,0x00000001,0x00040047,
|
||||
0x0000001a,0x00000022,0x00000000,0x00040047,0x00000036,0x00000021,0x00000000,0x00040047,
|
||||
0x00000036,0x00000022,0x00000000,0x00040047,0x0000004b,0x0000001e,0x00000000,0x00040047,
|
||||
0x0000004e,0x0000001e,0x00000001,0x00040047,0x00000052,0x0000001e,0x00000000,0x00020013,
|
||||
0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017,
|
||||
0x00000007,0x00000006,0x00000004,0x00040017,0x0000000d,0x00000006,0x00000002,0x00040017,
|
||||
0x00000015,0x00000006,0x00000003,0x000b001e,0x00000018,0x00000006,0x00000006,0x00000006,
|
||||
0x00000006,0x00000007,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,0x00000019,
|
||||
0x00000002,0x00000018,0x0004003b,0x00000019,0x0000001a,0x00000002,0x00040015,0x0000001b,
|
||||
0x00000020,0x00000001,0x0004002b,0x0000001b,0x0000001c,0x00000002,0x00040020,0x0000001d,
|
||||
0x00000002,0x00000006,0x00090019,0x00000033,0x00000006,0x00000001,0x00000000,0x00000000,
|
||||
0x00000000,0x00000001,0x00000000,0x0003001b,0x00000034,0x00000033,0x00040020,0x00000035,
|
||||
0x00000000,0x00000034,0x0004003b,0x00000035,0x00000036,0x00000000,0x00040020,0x00000046,
|
||||
0x00000001,0x00000007,0x00040020,0x0000004a,0x00000001,0x0000000d,0x0004003b,0x0000004a,
|
||||
0x0000004b,0x00000001,0x0004003b,0x00000046,0x0000004e,0x00000001,0x00040020,0x00000051,
|
||||
0x00000003,0x00000007,0x0004003b,0x00000051,0x00000052,0x00000003,0x00050036,0x00000002,
|
||||
0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x0000000d,0x0000004c,
|
||||
0x0000004b,0x0004003d,0x00000007,0x0000004f,0x0000004e,0x0004003d,0x00000034,0x00000078,
|
||||
0x00000036,0x00050057,0x00000007,0x0000007b,0x00000078,0x0000004c,0x0008004f,0x00000015,
|
||||
0x00000084,0x0000007b,0x0000007b,0x00000000,0x00000001,0x00000002,0x00050041,0x0000001d,
|
||||
0x00000085,0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000086,0x00000085,0x0005008e,
|
||||
0x00000015,0x00000087,0x00000084,0x00000086,0x00050051,0x00000006,0x00000089,0x00000087,
|
||||
0x00000000,0x00050051,0x00000006,0x0000008b,0x00000087,0x00000001,0x00050051,0x00000006,
|
||||
0x0000008d,0x00000087,0x00000002,0x00050051,0x00000006,0x0000008f,0x0000007b,0x00000003,
|
||||
0x00070050,0x00000007,0x000000a7,0x00000089,0x0000008b,0x0000008d,0x0000008f,0x00050085,
|
||||
0x00000007,0x0000007f,0x000000a7,0x0000004f,0x0003003e,0x00000052,0x0000007f,0x000100fd,
|
||||
0x00010038
|
||||
0x00000018,0x00000000,0x47526373,0x756f5f42,0x74757074,0x00000000,0x00070006,0x00000018,
|
||||
0x00000001,0x74786574,0x5f657275,0x65707974,0x00000000,0x00060006,0x00000018,0x00000002,
|
||||
0x75706e69,0x79745f74,0x00006570,0x00060006,0x00000018,0x00000003,0x6f6c6f63,0x63735f72,
|
||||
0x00656c61,0x00060006,0x00000018,0x00000004,0x65786574,0x69735f6c,0x0000657a,0x00070006,
|
||||
0x00000018,0x00000005,0x656e6f74,0x5f70616d,0x6874656d,0x0000646f,0x00070006,0x00000018,
|
||||
0x00000006,0x656e6f74,0x5f70616d,0x74636166,0x0031726f,0x00070006,0x00000018,0x00000007,
|
||||
0x656e6f74,0x5f70616d,0x74636166,0x0032726f,0x00070006,0x00000018,0x00000008,0x5f726473,
|
||||
0x74696877,0x6f705f65,0x00746e69,0x00030005,0x0000001a,0x00000000,0x00050005,0x00000036,
|
||||
0x74786574,0x30657275,0x00000000,0x00050005,0x0000004c,0x75706e69,0x65742e74,0x00000078,
|
||||
0x00050005,0x0000004f,0x75706e69,0x6f632e74,0x00726f6c,0x00070005,0x00000053,0x746e6540,
|
||||
0x6f507972,0x4f746e69,0x75707475,0x00000074,0x00030047,0x00000018,0x00000002,0x00050048,
|
||||
0x00000018,0x00000000,0x00000023,0x00000000,0x00050048,0x00000018,0x00000001,0x00000023,
|
||||
0x00000004,0x00050048,0x00000018,0x00000002,0x00000023,0x00000008,0x00050048,0x00000018,
|
||||
0x00000003,0x00000023,0x0000000c,0x00050048,0x00000018,0x00000004,0x00000023,0x00000010,
|
||||
0x00050048,0x00000018,0x00000005,0x00000023,0x00000020,0x00050048,0x00000018,0x00000006,
|
||||
0x00000023,0x00000024,0x00050048,0x00000018,0x00000007,0x00000023,0x00000028,0x00050048,
|
||||
0x00000018,0x00000008,0x00000023,0x0000002c,0x00040047,0x0000001a,0x00000021,0x00000000,
|
||||
0x00040047,0x0000001a,0x00000022,0x00000000,0x00040047,0x00000036,0x00000021,0x00000001,
|
||||
0x00040047,0x00000036,0x00000022,0x00000000,0x00040047,0x0000004c,0x0000001e,0x00000000,
|
||||
0x00040047,0x0000004f,0x0000001e,0x00000001,0x00040047,0x00000053,0x0000001e,0x00000000,
|
||||
0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,
|
||||
0x00040017,0x00000007,0x00000006,0x00000004,0x00040017,0x0000000d,0x00000006,0x00000002,
|
||||
0x00040017,0x00000015,0x00000006,0x00000003,0x000b001e,0x00000018,0x00000006,0x00000006,
|
||||
0x00000006,0x00000006,0x00000007,0x00000006,0x00000006,0x00000006,0x00000006,0x00040020,
|
||||
0x00000019,0x00000002,0x00000018,0x0004003b,0x00000019,0x0000001a,0x00000002,0x00040015,
|
||||
0x0000001b,0x00000020,0x00000001,0x0004002b,0x0000001b,0x0000001c,0x00000003,0x00040020,
|
||||
0x0000001d,0x00000002,0x00000006,0x00090019,0x00000033,0x00000006,0x00000001,0x00000000,
|
||||
0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x00000034,0x00000033,0x00040020,
|
||||
0x00000035,0x00000000,0x00000034,0x0004003b,0x00000035,0x00000036,0x00000000,0x00040020,
|
||||
0x00000047,0x00000001,0x00000007,0x00040020,0x0000004b,0x00000001,0x0000000d,0x0004003b,
|
||||
0x0000004b,0x0000004c,0x00000001,0x0004003b,0x00000047,0x0000004f,0x00000001,0x00040020,
|
||||
0x00000052,0x00000003,0x00000007,0x0004003b,0x00000052,0x00000053,0x00000003,0x00050036,
|
||||
0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003d,0x0000000d,
|
||||
0x0000004d,0x0000004c,0x0004003d,0x00000007,0x00000050,0x0000004f,0x0004003d,0x00000034,
|
||||
0x0000007b,0x00000036,0x00050057,0x00000007,0x0000007e,0x0000007b,0x0000004d,0x0008004f,
|
||||
0x00000015,0x00000087,0x0000007e,0x0000007e,0x00000000,0x00000001,0x00000002,0x00050041,
|
||||
0x0000001d,0x00000088,0x0000001a,0x0000001c,0x0004003d,0x00000006,0x00000089,0x00000088,
|
||||
0x0005008e,0x00000015,0x0000008a,0x00000087,0x00000089,0x00050051,0x00000006,0x0000008c,
|
||||
0x0000008a,0x00000000,0x00050051,0x00000006,0x0000008e,0x0000008a,0x00000001,0x00050051,
|
||||
0x00000006,0x00000090,0x0000008a,0x00000002,0x00050051,0x00000006,0x00000092,0x0000007e,
|
||||
0x00000003,0x00070050,0x00000007,0x000000aa,0x0000008c,0x0000008e,0x00000090,0x00000092,
|
||||
0x00050085,0x00000007,0x00000082,0x000000aa,0x00000050,0x0003003e,0x00000053,0x00000082,
|
||||
0x000100fd,0x00010038
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user